Autor |
Beitrag |
bartuc
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 04.12.06 20:48
Hallo zusammen
Bin neu hier im Forum, deshalb weis ich nicht ob ich hier richtig bin. wenn nicht, bitte verschieben =).
Also habe folgendes Problem.
Muss für die Schule ein Spiel programmieren. Hatte mir vorgenommen ein Jump and Run spiel zu entwickeln. Nur gibt es bei der Steuerung ein Problem.
Wenn ich durch "Space" springe, soll das Bild auf dem unterliegenden objekt (bei mir sind das Shapes) landen und nicht in der Luft stehen.
Hab folgendes geschrieben
Delphi-Quelltext 1: 2: 3:
| if Key = VK_SPACE then begin if Unit2.IstAufDemBoden(image1.TCanvas) then begin ImgCartman.YSpeed := -20; |
Der Compiler zeigt mir folgeden Fehler an:
Delphi-Quelltext 1: 2:
| [Pascal Error] Unit1.pas(154): E2066 Missing operator or semicolon [Pascal Error] Unit1.pas(155): E2003 Undeclared identifier: 'YSpeed' |
Ich versteh nicht was der Compiler mir sagen will.
Hat jemand eine Idee und könnte mir helfen endlich mein Bild richtig zum springen zu kriegen?
MFG
Bartuc =)
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mo 04.12.06 21:39
1: da fehlt ein semikolon und Yspeed ist nirgends deklariert würde ich sagen 
|
|
bartuc 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 04.12.06 21:56
wo soll denn da ein Semikolon fehlen?
und yspeed müsste declariert sein oder?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| private FLeft: Integer; FTop: Integer; FWidth: Integer; FHeight: Integer; FXSpeed: Integer; FYSpeed: Integer; FBitmap: Boolean; |
ich sitz an der sache schon knapp 3 wochen und habs immernoch nicht hinbekommen *schnüff*
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mo 04.12.06 22:00
FYSpeed hast du aber net YSpeed
|
|
Ironwulf
      
Beiträge: 733
Erhaltene Danke: 2
|
Verfasst: Mo 04.12.06 22:03
und der erste fehler wird kommen weil du Image1.TCanvas hast und nich Image1.Canvas
|
|
bartuc 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 04.12.06 22:30
habs mal geändert aber der Fehler kommt immernoch an der selben stelle. =(
|
|
bartuc 
Hält's aus hier
Beiträge: 9
|
Verfasst: Mo 04.12.06 23:11
kennt sonst jemand vielleicht eine alternative um ein bild "springen" zu lassen?
Habs mal mit nem Timer versucht. aber dann ist das "springen" nicht flüssig und ich kann nicht seitwärts springen.
MFG
Bartuc
|
|
delphistart
      
Beiträge: 119
|
Verfasst: Di 05.12.06 00:10
Titel: Andere Möglichkeit
Du könntest das Bild über eine Schleife bewegen.
Etwa so:
Delphi-Quelltext 1: 2: 3:
| for i := 0 to 233 do begin Image1.Left := Image.Left - 1; pause(5); |
Mit der schleife wird dein Bild 233 mal um ein Pixel nach rechts verschoben. Für die Bewegung nach Links müsstest du Image.Left+1 setzen für ein nach oben Image.Top-1 und für eine nach unten Image.Top+1. Die aufgerufen Procedur Pause brauchst du, damit delphi eine Pause zwischen den durchläufen der Schleife macht.
Hier die procedure pause:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.pause(zeit: integer); var m,n : integer; begin m := gettickcount; repeat n := gettickcount; Application.ProcessMessages; until (n-m>zeit); end; |
Die Geschwindigkeit kannst du über den übergebenen Zeitwert in MS ändern.
Für dein Problem mit dem springen kannst du die obere procedure so abändern, dass sie eine Bewegung verursacht, die du für deinen Sprung haben willst. Diese kannst du über Button Tastendruck oder wie auch immer aufrufen.
Wenn das Bild sich über den Bilschirm bewegen soll un der Benutzer dabei über Hindernisse springt, dann Brauchst du also eine Kombination aus mehreren proceduren. Eine die Konstant dein Bild zur Seite bewegt und eine die bei Tastendruck die Bewegung nach oben und auch wieder nach unten auslöst.
Ich hoffe das hilft dir! 
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: Di 05.12.06 00:44
Hallo,
ganz einfaches Zählen könnte so gehen (aus dem Kopf): Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var A: Array [0..255] of Integer; I: Integer; S: String; begin S := 'astalavista'; FillChar(A, SizeOf(A), 0); for I := 1 to Length(S) do Inc(A[Ord(S[I])]); end; | Edit: Bitte löschen, bin verrutscht!
Gruß Hape!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Zuletzt bearbeitet von wulfskin am Di 05.12.06 14:24, insgesamt 1-mal bearbeitet
|
|
Ironwulf
      
Beiträge: 733
Erhaltene Danke: 2
|
Verfasst: Di 05.12.06 00:54
*hust* du bist im thread verrutscht
|
|
bartuc 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 05.12.06 14:22
Mit der pause procedure hat es leider nicht geklappt.
hab es mal wieder mit einem Timer versucht und da kam das raus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.Timer1Timer(Sender: TObject); begin if imgcartman.Top = -100 then begin timer1.Enabled := false; timer2.enabled := true; 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; |
Timer1 wird gestartet wenn ich die Leertaste drücke:
Delphi-Quelltext 1: 2: 3: 4:
| VK_SPACE: begin timer1.enabled := true; Key := 0; end; |
aber es tut sich nichts.....
wenn ich die Leertaste drücke friert das Programm ein.
und ich find meinen fehler nicht.
Könnt ihr mir vielleicht weiterhelfen?
MFG
|
|
delphistart
      
Beiträge: 119
|
Verfasst: Di 05.12.06 18:59
bartuc hat folgendes geschrieben: | Mit der pause procedure hat es leider nicht geklappt. |
Poste doch mal deinen Quelltext, wo du die Pauseprocedur eingebaut hast. Ich hab die aus einem Programm von mir kopiert, wo eine Figur durch ein Labyrinth läuft. Müsste also eigentlich gehen. Vielleicht finde ich dann den Fehler!
Ansonsten kann ich dir auch gerne mal mein Programm Mailen, wenn du mir deine Asresse gibst.
Gruß Jonas
|
|
monster
      
Beiträge: 51
Win XP
Delphi 2005 PE
|
Verfasst: Di 05.12.06 20:41
check mal die Zeilen 4 und 5, die kommen mir etwas suspekt vor.
Mit der TTimer-Komponente wirst Du in einer so zeitkritischen Anwendung wie einem Jump'n'Run nicht weit kommen, dazu ist der Timer zu langsam und du musst bedenken, dass sich mehrere Objekte gleichzeitig bewegen... sprich Du brauchst ein paar hundert Zeilen Code, die das alles auch verwalten.
Trotzdem: es gibt 2 Möglichkeiten:
1. Platziere ein TApplicationEvents auf deiner Form und führe die Bewegungen im onIdle aus (setze done auf false).
2. Nimm einen hochauflösenden Timer.
Passender Link: wiki.delphigl.com/in...p/Timebased_Movement
Ich empfehle dir dringend, mit etwas Leichterem anzufangen als ausgerechnet einem Jump'n'Run... das ist nämlich ziemlich hart.
|
|
bartuc 
Hält's aus hier
Beiträge: 9
|
Verfasst: Di 05.12.06 22:10
Zitat: |
1. Platziere ein TApplicationEvents auf deiner Form und führe die Bewegungen im onIdle aus (setze done auf false).
|
Sry, versteh da nur Bahnhof. TApplicationevents ? onIdle ?
und auf Wikipedia bin ich auch nicht schlauer geworden.
Zitat: |
2. Nimm einen hochauflösenden Timer.
|
wie erstell ich denn einen?
|
|
jakobwenzel
      
Beiträge: 1889
Erhaltene Danke: 1
XP home, ubuntu
BDS 2006 Prof
|
Verfasst: Di 05.12.06 22:15
bartuc hat folgendes geschrieben: | Zitat: |
1. Platziere ein TApplicationEvents auf deiner Form und führe die Bewegungen im onIdle aus (setze done auf false).
|
Sry, versteh da nur Bahnhof. TApplicationevents ? onIdle ?
und auf Wikipedia bin ich auch nicht schlauer geworden. |
TSpplicationEvents ist eine nicht visuelle Komponente (Regster Win32, IMHO), die dazu dient, verschiedene Ereignisse, die für die gesamte Anwendung gelten, leichter zuweisbar zu machen. In dem Fall ist das OnIdle, das immer aufgerufen wird, wenn dem Prozi grad langweilig ist (der sucht halt beschäftigung  ). Wenn du diese Methode benutzt ist es wichtig, den POarameter Done auf in der Prozedur false zu setzen, sonst wird OnIdle erst wieder bei Mausbewegung oder Tastendruck aufgerufen (weil Windows denkt, dass wir fertig sind).
_________________ I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
|
|
bartuc 
Hält's aus hier
Beiträge: 9
|
Verfasst: Do 07.12.06 11:47
also ich komm mit dem TApplicationevents und onIdle nicht klar....
hab aber noch eine andere Frage.... wenn ich z.b nach rechts gehe und dann springen möchte, soll das bild nicht nur senkrecht springen sondern sich auch gleichzeitig nach rechs bewegen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| VK_Right: begin if timer1.Enabled = true then begin Imgcartman.left := Imgcartman.Left +10; Imgcartman.top := Imgcartman.top -10; end else begin ImgCartman.Left := ImgCartman.Left + 10; Key := 0; end; |
Timer 1 startet den Sprung nach oben.
aber es passiert nichts.
wie müsste ich den befehl ändern?
|
|