Autor Beitrag
Blobby
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 06.06.10 15:38 
Hey,

Ich bin recht neu in Sachen Delphi und arbeite gerade für die Schule an einem größeren Projekt aufeigene Faust. Ich will eine Art Doodlejump für den Computer entwickeln. Das Spielprinzip ist denkbar einfach und mein Ansatz auch. Das Springen ist automatisch aktiviert und die Spielfigur springt hoch, am höchsten Punkt fällt sie wieder, wie wir es von der Schwerkraft kennen. Sobald die Spielfigur nun auf ein Objekt trifft, springt es erneut, bis man oben angekommen oder zu weit nach unten (aus dem Bildschirmrand) gefallen ist. Selbst kann man nur rechts und links steuern.

Angedacht ist nun ein Bild im Hintergrund (unser Level) und ein Bild im Vordergrund (die Spielfigur). Sobald das Spiel startet wird eine Sprungsequenz in Gang gesetzt. Ich hab das ganze hier mal aufgeschrieben, wie es gemeint ist. "jt" ist dabei die Flugzeit und "score" die eigentliche Pixelhöhe, die später zur Ausgabe gebraucht wird!

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
begin
  jt := 0;
  repeat
    jt := jt + 1;
    if Img_model.top > 200 then
      Img_model.top := Img_model.top - 1
    else
      Img_bg.top := Img_bg.top + 1;
    sleep (33);
    score := score + 1;
  until jt = 60;
  sleep (10);
end;


Doch habe ich nun das Problem, dass der eigentliche Flugfortschritt nicht angezeigt wird. Ich möchte ja meinen flüssigen Flug sehen und nicht, dass nach 2 Sekunden meine Spielfigur 60 Pixel weiter nach oben gesprungen ist.

Wie mache ich den Fortschritt sichtbar und aus dem ganzen einen schönen Ablauf?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19325
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.06.10 15:43 
Hallo und :welcome: im Forum!

Da fehlt noch ein Application.ProcessMessages, damit die verschobenen Komponenten auch neu angezeigt werden. Denn ansonsten kann die Abarbeitung der Zeichenbefehle (Windows-Botschaften) erst nach dem Ende deines Codes passieren.

Besser wäre es allerdings gar nicht erst visuelle Komponenten zu verschieben, aber das ist ein anderes Thema. Funktionieren tut es ja erst einmal so.
Blobby
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 06.06.10 15:58 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome: im Forum!

Da fehlt noch ein Application.ProcessMessages, damit die verschobenen Komponenten auch neu angezeigt werden. Denn ansonsten kann die Abarbeitung der Zeichenbefehle (Windows-Botschaften) erst nach dem Ende deines Codes passieren.

Besser wäre es allerdings gar nicht erst visuelle Komponenten zu verschieben, aber das ist ein anderes Thema. Funktionieren tut es ja erst einmal so.


Danke für den Tipp!

Ich werd ich auch gleich, sobald ich den gesamten Programmcode wieder in den Fingern hab auch mal umsetzten.

Doch warum ist meine Lösung mit dem verschieben denn suboptimal? Ein großes Levelbild, das nur verschoben wird, wird doch wohl am wenigsten Speicherplatz benötigen. Oder liege ich da falsch?

Auch hab ich noch das Problem, dass ich ja auch meine Spielfigur lenken will. Sprich auf Tastendruck von "w" bw. "d" eine Verschiebung der Spielfigur horizontal haben möchte. Das ganze wollte ich eigentlich nach ähnlichem Aufbau machen. Schleife, die bis 60 zählt und die Figur seitlich verschiebt. Dabei darf der Sprung natürlich nicht unterbrochen werden, sondern muss parallel laufen. Doch wie schaffe ich es die beiden Schleifen zu vereinen, damit ich praktisch einen diagonalen Sprung auf die Reihe bekomme?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19325
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 06.06.10 16:01 
Man kann das ganze aber auch selbst auf eine größere Zeichenfläche zeichnen, dann spart man sich den Overhead durch die visuelle Komponente. Das flackert sonst eben ein wenig. Solange es nur wenige Komponenten sind, geht das noch, aber wenn das dann mehr werden, hat man keinen Spaß mehr dran. ;-)

Was da alles möglich ist, siehst du an diesem Projekt:
www.delphi-forum.de/viewtopic.php?p=557541
Das besteht nur aus einer großen Zeichenfläche (von der kleinen Leiste oben abgesehen).
Blobby
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 11.06.10 22:19 
Ich hab schon wieder ein Problem. Das Spiel ist jetzt soweit gemacht und funktioniert einwandfrei!

Nun möchte ich einen Start-Screen einbauen. Darum hab ich mir gedacht, mach ich einfach 2 Bilder, die sich abwechseln! Also einfach ins Formcreate eine Schleife!+

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
while (start = true) do
  begin
    sleep (2000);
    counter := counter + 1;
    if counter mod 2 = 1 then
    begin
      Img_menu_start.visible := true;
      Img_menu_clean.visible := false;
    end
    else
    begin
      Img_menu_start.visible := false;
      Img_menu_clean.visible := true;
    end;
  end;


Und dann ins KeyPress die Abfrage!

ausblenden Delphi-Quelltext
1:
2:
if (start = true) and (key = 'VK_Return'then
    start := true;


Aber es will einfach nicht funktionieren. Das Fenster zeigt sich gar nicht erst. Ich denke, weil das Formcreate nicht durchlaufen kann!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 11.06.10 22:22 
Moin!

Bitte erstelle für jede deiner Fragen ein separates Topic, da die Diskussion mehrerer Fragen in einem Topic für gewöhnlich für Verwirrung und Durcheinander sorgt. Danke. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.