![]() |
Jump and Run! need help !
Hi zusammen
Wollte ein Jump and Run Spiel programmieren. Geht soweit gut voran, allerdings hab ich probleme bei der Steuerung. Habe ein Bild eingefügt das sich bewegt wenn man die Pfeiltasten drückt. (links/rechts) Nun will ich das aber noch zum "Springen" bringen durch drücken der Leertaste. Wie klappt das genau. Am besten ohne großen hänger. Hab mal was versucht. Das Bild wird zwar weiteroben angezeigt aber es kommt nicht mehr runter. Ich hoffe ihr könnt mir helfen MFG |
Re: Jump and Run! need help !
Der Fehler liegt in Z. 123! :mrgreen:
Jetz ma im ernst: Ohne COde kann dir niemand helfen. |
Re: Jump and Run! need help !
also das ist ein auszug des quelltextes
Delphi-Quellcode:
Möchte jetzt nur das zum "Springen" bringen wenn man auf die Leertaste drückt
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin case Key of VK_LEFT: begin ImgCartman.Left := ImgCartman.Left - 10; Key := 0; end; VK_Right: begin ImgCartman.left := ImgCartman.Left + 10; Key := 0; end; VK_Space: begin ImgCartman.Top := ImgCartman.top - 50; Key := 0; end; end; [edit=r_kerber]Delphi-Tags eingefügt. Mfg, r_kerber[/edit] |
Re: Jump and Run! need help !
naja ;) wenn du ne schöne sprunganimation haben willst musste entweder eine schleife machen die für das rauf und dann wieder runterkommen da is bzw einen timer schalten wo du im gewissen sekundentakt das bild je nachdem auf welcher höhe es sich befindet nach oben oder unten steuert
obwohl das so natürlich kein jum and run sondern ein press and move the picture programm is ;) lg Nico |
Re: Jump and Run! need help !
juhu ein southpark jump and run ! :D
|
Re: Jump and Run! need help !
Hallo Bartuc, herzlich Willkommen in der DP! :cheers:
Suchst Du jetzt Leute, die mit Dir ein Spiel programmieren wollen, oder Hilfe wie Du es programmierst? Bei zweiterem wäre die Sparte die Falsche. Wenn Du Quellcodes postest, dann benutze bitte die Delphi-Tags, damit man das besser lesen kann. Grüßle! :dp: PS: Für echt flüssige Sprünge solltest Du wohl eher nicht eine Image auf dem Formular verschieben. :wink: |
Re: Jump and Run! need help !
Eigentlich brauche ich Hilfe um das Spiel zu programmieren.
Muss das für die Schule machen. Hab auch noch nicht so viel Delphikenntnisse Welche Möglickeiten gibt es denn sonst noch um "Figuren" springen zu lassen? |
DP-Maintenance
Dieses Thema wurde von "r_kerber" von "Projekte" nach "Multimedia" verschoben.
Du suchst ja keine Mitstreiter in einem Projekt sondern hats eine Frage zu Multimedia (im weitesten Sinne) Deshalb verswchiebe ich mal. |
Re: Jump and Run! need help !
ich darf dir wärmstens "Delphi for Kids" von Hans-Georg Schumann ans herz legen - von der Reihe gibts dann auch eine für Game-Programming, 3D Programmierung usw(wobei das game-Programming sogar so ein 2D jump and Run in sehr einfacher Form beinhalted)
das Buch ist nicht teuer und gibts in jedem guten Buchladen(glaub 15-21€musst du rechnen) übrigens glaube ich dir nicht dass dein Professor dir ein Jump and Run als hausaufgabe gibt, weil die programmierung eines solchen sicher zu lange dauert für die üblichen wochen, monats abgaben ;) lg Nico |
Re: Jump and Run! need help !
|
Re: Jump and Run! need help !
try this... spiel mal bissl mit den sleep werten und den until bedingungen..
Delphi-Quellcode:
Gruß
var
nCurrTop : integer; begin with ImgCartman do begin // Zwischenspeichern der aktuellen Höhe speichern nCurrTop := Top; // Hochspringen repeat Top := Top - 10; { TODO -oBartuc : hier kannst du noch eventuell nach links oder rechts springen.. einfach mit Left := Left +/- n; } // Kurz warten damit's ned zu schnell geht.. Sleep(15); // Rechenzeit frei geben damit das Bild auch flüssig hoch und runter hüpft... Application.ProcessMessages; until ( Top = nCurrTop - 150 ); // Und wieder runter fallen... repeat Top := Top + 10; Sleep(15); Application.ProcessMessages; until ( Top = nCurrTop ); end; Reli |
Re: Jump and Run! need help !
Danke schonmal für die Tipps...
Also flüssig springen tut er jetzt schon, aber jetzt gibt es eine andere sache. Wenn ich nach links oder nach rechts gehe, fängt der auch an zu springen. Wie kann ich denn den Befehl "springen" auf die Leertaste belegen? |
Re: Jump and Run! need help !
klar... musst bei dir mit in den case-switch bauen...
Delphi-Quellcode:
hast es doch quasi selbst schon geschrieben wie du es einsetzen musst :-)
VK_Space: begin
// hier rein end; die variablendeklaration muss natürlich zwischen procedure und dem begin gruß Reli |
Re: Jump and Run! need help !
Cool danke... klappt soweit....
Nur gibt es jetzt noch ein kleines Problemschen. wenn ich 2xmal die Leertaste drücke bleibt das bild weiter oben stehen. gibt es ein befehl der das bild beim sprung immer auf eine "Grundlinie" bringt? |
Re: Jump and Run! need help !
Du solltest einfach beim drücken der Taste Space vorher überprüfen, ob das Bild auf der Grundlinie ist. Und nur dann den Code ausführen der es springen lässt.
Uwe |
Re: Jump and Run! need help !
ich denke mal am besten wäre es, wenn du dir einen timer einbaust, der alle 50ms überprüft, ob sich unter deinem bild ein "boden" (z.b. ein anderes bild) befindet, wenn dies nicht der fall sein sollte, fällt cartman runter, bis er an einem bild ist (deswegen timer)
hat den vorteil, das du im fall noch irgendwas anderes berechnen kannst, und nicht in der schleife hängst würde das evtl so umbauen, das dein bild ne globale variable für die geschwindigkeit hat (in x und y) die dann jedesmal beim durchlauf des timers beachtet wird (bzw. geändert durch schwerkraft) dann musst du nur beim sprung definieren, das Vy = 20 ist, und das ding fliegt los, der timer bewegt bei jedem durchlauf das bild um 20 pixel nach oben, und zieht von Vy z.b. 5 ab sodas er in der nächsten schleife nur noch 15 nach oben geht und so weiter bis er irgend wann mal bei 0 pixeln, dann gehts wieder rückwärts. ne kollisions abfrage rein, damit er auch wieder am boden damit aufhört. beim laufen setzt du einfach Vx auf +/- 10 oder so und wenn die taste losgelassen wird wieder auf 0 zurück (außer du bist in der luft dann fliegt er sogar parabeln, wenn er schief springt). wenn du das alles hast, hast du quasi ne simple physik engine, die das schon sehr realistisch aussehen lassen MfG |
Re: Jump and Run! need help !
Zitat:
und wo geb ich das an? Zitat:
und wie schreibe ich eine Kollisionsabfrage? Danke schonmal für die Erläuterungen. Bin erst paar monate mit Delphi am programmieren und hab noch nicht soviel Ahnung von den Begriffen. :wink: |
Re: Jump and Run! need help !
Programmierst du objektorientiert, d.h. du verwendest mehrere Units mit mehreren Klassen? Das erweist sich nämlich fast immer als sehr vorteilhaft. Tutorials dazu findest du auf dsdt.info.
Dann könntest du z.B. eine Klasse TPlayer bauen, in der alle möglichen Instanzen eines Spielers, also einer Figur gespeichert werden. Dort kannst du dann u.a. die Geschwindigkeit in x-Richtung und die Geschwindigkeit in y-Richtung speichern. Das ist das, was Panzerfischer sagte. Mit Vy meint er die Y-Gescheindigkeit, also die senkrechte. Wenn gesprungen wird, wird die Y-Geschwindigkeit auf einen Wert gesetzt und dann kontinuierlich erniedrigt, bis sie ein anderes Vorzeichen hat und die Figur irgendwann wieder auf dem Boden steht. Die Abfrage, ob die Figur auf dem Boden steht, kannst du so machen: Du hast ja sicher eine Map. Diese könntest du zusätzlich in schwarz-weiß speichern (also Monochrome-Bitmap). Schwarz machst du dann alle Pixel, die NICHT betreten werden dürfen und weiß die anderen. Bei jedem Timer-Aufruf prüfst du dann alle Pixel dieses Monochrome-Bitmaps, die sich dort befinden, wo gerade die Füße der Figur direkt drauf stehen. Wenn alle weiß sind, fällt die Figur, sonst muss die Y-Geschwindigkeit auf 0 gesetzt werden (falls sie das noch nicht ist). |
Re: Jump and Run! need help !
Bei den Tutorials habe ich nur was für 3D gelesen. Möchte es aber 2D machen.
und kannst du mir die Abfrage vielleicht was genauer erklären? Zitat:
|
Re: Jump and Run! need help !
Ich meinte nicht die Graphik-Tutorials, sondern die zur Objektorientierung. Wenn du damit noch keine Erfahrung hast, kannst du
![]() ![]() So könnte eine Klasse TFigur aussehen:
Delphi-Quellcode:
In der Haupt-Unit schreibst du dann im FormKeyDown:
TFigur = class
private FLeft: Integer; FTop: Integer; FWidth: Integer; FHeight: Integer; FXSpeed: Integer; FYSpeed: Integer; FBitmap: TBitmap; { ... } public function IstAufDemBoden(const Map: TCanvas): Boolean; // Map ist die Schwarz-Weiß-Karte property YSpeed: Integer read FYSpeed write FYSpeed; { ... } end; implementation function TFigur.IstAufDemBoden(const Map: TCanvas): Boolean; var Randposition: Integer; begin Result := False; for Randposition := 0 to FWidth do if Map.Pixels[FLeft + Randposition, FTop + FHeight] = clBlack then begin Result := True; Exit; end; end; { ... }
Delphi-Quellcode:
Und im Timer-Aufruf:
if Key = VK_SPACE then
if Figur.IstAufDemBoden(ImSchwarzWeiss.Canvas) then Figur.YSpeed := -20;
Delphi-Quellcode:
if Figur.IstAufDemBoden then
FYSpeed := 0 else FYSpeed := FYSpeed + 3; Wenn du noch fragen hast, sag Bescheid. |
Re: Jump and Run! need help !
Klappt bei mir nicht so ganz.....
wenn ich starten will kommt dieser Fehler:
Delphi-Quellcode:
was heißt das genau?
TFigur = class
[Error] Unit1.pas(51): ',' or ':' expected but '=' found oder muss man den Teil an einer bestimmten stelle einfügen? |
Re: Jump and Run! need help !
Deswegen hab ich ja zu den beiden Tutorials verlinkt. In den Type-Abschnitt kommt die Typ-Deklaration.
|
Re: Jump and Run! need help !
Habs mir jetzt nochmal durchgelesen.Verstehen tue ich aber nicht viel :(
hab ne neue Unit für die Klasse erstellt. aber beim starten tritt diesmal dieser Fehler auf Zitat:
|
Re: Jump and Run! need help !
Ja, wenn so ein Fehler kommt, hilft immer: Mit dem Cursor in das Wort gehen (also TCanvas), F1 drücken. Dort liest du dann, in welcher Unit der Typ deklariert ist. In diesem Fall: Graphics. Das musst du dann unter "uses" einbinden.
|
Re: Jump and Run! need help !
Danke das hat geklappt,
aber jetzt gibts wieder ein problem... eigentlich genauso wie von vorher aber ich weiß nicht was ich jetzt machen soll:
Delphi-Quellcode:
if Key = VK_SPACE then
if ImgCartman.IstAufDemBoden(ImSchwarzWeiss.Canvas) then Imgcartman.YSpeed := -20;
Delphi-Quellcode:
Muss ich da wieder was bei uses eintragen? "F1" hat mir nicht weiterhelfen können
[Error] Unit1.pas(141): Undeclared identifier: 'IstAufDemBoden'
[Error] Unit1.pas(141): Undeclared identifier: 'ImSchwarzWeiss' [Error] Unit1.pas(141): 'THEN' expected but identifier 'Canvas' found |
Re: Jump and Run! need help !
Ja, du musst wieder etwas in die Uses-Klausel einfügen. Wenn du einen Typ aus einer anderen Unit verwendest (wie z.B. TCanvas, was in der Unit Graphics deklariert ist), musst du die Unit im Uses-Abschnitt eintragen. Genauso ist das bei Prozeduren und Funktionen. Die Funktion IntToStr ist z.B. in der Unit SysUtils deklariert und implementiert. Wenn du in deinem Code also IntToStr verwendest, musst du in dieser Unit SysUtils unter Uses einbinden.
IstAufDemBoden hast du wahrscheinlich selbst in einer anderen Unit implementiert. Dann musst du in der Aufrufenden Unit die Unit einbinden, in der du IstAufDemBoden deklariert hast. Dass dir in diesem Fall F1 nicht weiterhilft, ist normal: Über F1 gelangst du in die Delphi-Hilfe. Dort stehen aber natürlich nur Informationen über Klassen, Methoden oder sonstiges, die von Delphi kommen. Über von dir geschriebenen Code kann Delphi ja nichts in seiner Hilfe schreiben. Mit ImSchwarzWeiss meinte ich nur den Namen des Images, in das du die Schwarz-Weiß-Version der Map laden solltest. Dazu musst du natürlich erstmal ein solches Image auf deinem Formular platzieren und über die Eigenschaft Picture im OI das Bild einfügen. Du kannst dem Image natürlich auch einen anderen Namen geben als "ImSchwarzWeiß". |
Re: Jump and Run! need help !
Zitat:
Woran kanns sonst liegen? Was meintest du mit "in einer anderen Unit implementiert" ? bzw "Dann musst du in der Aufrufenden Unit die Unit einbinden"? |
Re: Jump and Run! need help !
Delphi-Quellcode:
if Key = VK_SPACE then begin
if Unit2.IstAufDemBoden(image1.TCanvas) then begin ImgCartman.YSpeed := -20; end;
Delphi-Quellcode:
Wieso verlangt der vor der Klammer einen operator oder ein semikolon?
[Pascal Error] Unit1.pas(154): E2066 Missing operator or semicolon
[Pascal Error] Unit1.pas(155): E2003 Undeclared identifier: 'YSpeed' und was hat das mit YSpeed auf sich? Need help please =( |
Re: Jump and Run! need help !
du hast zwei begin's aber nur ein end ;)
|
Re: Jump and Run! need help !
das 2. end; hab ich vergessen einzufügen :wink:
aber das scheint irgendwie nicht zu klappen... sonst noch einer eine idee? |
Re: Jump and Run! need help !
Zitat:
Zitat:
Zitat:
|
Re: Jump and Run! need help !
Irgendwie blick ich da nicht so ganz durch mit den mehreren Units.
Habs mal mit nem Timer versucht.
Delphi-Quellcode:
Timer1 wird durch die Leertaste gestartet.
procedure TForm1.Timer1Timer(Sender: TObject);
begin if imgcartman.Top = imgcartman.Top -100 then begin timer1.Enabled := false; timer2.enabled := true; end else begin repeat Imgcartman.Top := Imgcartman.left -5; until (imgcartman.Top = imgcartman.Top -100); end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if imgcartman.Top = imgcartman.top +100 then begin timer2.enabled := false; end else begin repeat imgcartman.Top := imgcartman.Top +5; until (imgcartman.Top = imgcartman.Top +100); end; end;
Delphi-Quellcode:
Aber es klappt nicht... wenn ich die leertaste drücke friert das Programm ein.
VK_SPACE: begin
timer1.enabled := true; Key := 0; end; wo liegt der Fehler? ich finde den nicht. |
Re: Jump and Run! need help !
Sorry, aber so langsam beginne ich daran zu zweifeln, ob du das wirklich ernst meinst. Wie soll denn eine Zahl gleich sie selbst + 100 sein (imgCartman.Top = imgCartman.Top + 100)? Keine der Bedingungen kann je erfüllt werden. All deine Repeat-Until-Schleifen sind Endlos-Schleifen. Die Verknüpfung von Left und Top (Zeile 9) scheint mir auch total sinnlos.
|
Re: Jump and Run! need help !
ok hab ich gerade auch gesehen :?
Delphi-Quellcode:
so besser? aber es friert immernoch ein =(
procedure TForm1.Timer1Timer(Sender: TObject);
begin if imgcartman.Top = -100 then begin timer2.enabled := true; timer1.Enabled := false; end else begin repeat Imgcartman.Top := Imgcartman.top -5; until (imgcartman.Top = -100); end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if imgcartman.Top = 100 then begin timer2.enabled := false; end else begin repeat imgcartman.Top := imgcartman.Top +5; until (imgcartman.Top = 100); end; end; |
Re: Jump and Run! need help !
Welchen Wert besitzt imgCartman.Top denn, bevor der Timer gestartet wird? Ist er größer als -101? Ist er durch 5 teilbar? Statt mit '=' zu vergleichen, könntest du auch mal '<', '>', '<=' oder '>=' nehmen.
|
Re: Jump and Run! need help !
Delphi-Quellcode:
Schau mal, so ist es gelich viel lesbarer und tut auch garnicht mehr in den Augen weh ;)
procedure TForm1.Timer1Timer(Sender: TObject);
begin if imgcartman.Top = -100 then begin timer2.enabled := true; timer1.Enabled := false; end else begin repeat Imgcartman.Top := Imgcartman.top -5; until (imgcartman.Top = -100); end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if imgcartman.Top >= 100 then begin imgcartman.Top:=100; timer2.enabled := false; end else begin repeat imgcartman.Top := imgcartman.Top +5; until (imgcartman.Top = 100); end; end; Ich glaube dein Problem ist, dass du hier von ideen und Möglichkeiten überhäuft wirst und du das alles garnicht so schnell verstehen kannst. So wie oben kann es nicht Funktionieren.
Delphi-Quellcode:
SO ist es besser. Dafür, dass der Code mehrmals ausgeführt wird, sind die TImer ja schon da. Dann brauchst du auch keine repeat..untils mehr. Außeerdem kann es ja sein dass Top deines Images zb 2 ist, dann kommt der bei schrittweisem decrimentieren von 5 niemals auf 100.
procedure TForm1.Timer1Timer(Sender: TObject);
begin if imgcartman.Top <= -100 then begin timer2.enabled := true; timer1.Enabled := false; end else begin Imgcartman.Top := Imgcartman.top -5; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if imgcartman.Top >= 100 then begin imgcartman.Top:=100; timer2.enabled := false; end else begin imgcartman.Top := imgcartman.Top +5; end; end; |
Re: Jump and Run! need help !
hm.... bei mir bleibt das bild in der Luft stehen.
hab aber bissl rumprobiert und jetzt "springt" mein bild.
Delphi-Quellcode:
Das blöde ist das der jetzt immer bis auf top 424 fällt und nicht andere shapes oder so beachtet.
procedure TForm1.Timer1Timer(Sender: TObject);
begin if imgcartman.Top = 234 then begin timer2.enabled := true; timer1.Enabled := false; end else begin Imgcartman.Top := Imgcartman.top -2; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if imgcartman.Top = 424 then begin timer2.enabled := false; end else begin imgcartman.Top := imgcartman.Top +2; end; end; jemand eine idee? |
Re: Jump and Run! need help !
Zitat:
![]() |
Re: Jump and Run! need help !
cool danke..... klappt schon fast....
es gibt nur noch 2 probleme :angel2: das 1. ist... wenn ich mit dem bild von der Seite an das Shape komme läuft mein bild trotzdem noch hinein. wie kann ich der kollisionsabfrage sagen das das bild dann vor dem shape stehen bleibt? das 2. ist... wenn ich auf einer höheren ebene bin (shape) und ich gehe in richtung "abgrund", schwebt das bild weiter auf der selben höhe wie am shape. Aber es sollte ja wieder runter fallen bis es auf ein anderes shape kommt. Wie geht das? momentan siehts so aus:
Delphi-Quellcode:
Vielleicht hat jemand noch eine idee hat wie es einfacher geht. z.b. mit nur einem timer die abfrage machen.
procedure TForm1.Timer3Timer(Sender: TObject);
begin if IsCollision (Imgcartman.BoundsRect, S_2.BoundsRect) then timer2.enabled := false ; end; procedure TForm1.Timer4Timer(Sender: TObject); begin if IsCollision (Imgcartman.BoundsRect, S_1.BoundsRect) then timer2.enabled := false end; Danke schonmal =) |
Re: Jump and Run! need help !
Zitat:
Zitat:
Delphi-Quellcode:
else
Timer2.Enabled := True; Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz