Entwickler-Ecke
Multimedia / Grafik - Problem mit Timer!
-delphin- - Di 26.07.05 23:35
Titel: Problem mit Timer!
Also, ich progge ein Jump&Run-Spiel, das Problem besteht kurz gesagt nur darin, dass ein Image mit Timer um 8 nach links verschoben werden soll, bis es auf ein anderes Image trifft, dann soll es zum Ausgangspunkt zurück und nach 5 Sekunden wieder um 8 verschoben werden bis es auf das andere trifft.
Also:
1.) FormCreate
2.) 5 Sec. warten
3.) Durch Timer verschieben um 8 nach links
4.) Image (IFireUSA) trifft auf anderes Image (IFire)
5.) IFireUSA auf Ausgangspunkt
6.) 5 Sec. warten
7.) wieder bei 3.) weiter
Was bei dem Sourcecode da unten passiert ist schlichtweg alles bis Punkt 6, dort wartet er nämlich Ewigkeiten und verschiebt es gar nicht mehr.
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: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| procedure TForm1.TimerUSATimer(Sender: TObject); begin zeitUSA:=zeitUSA+1; case zeitUSA of 5: phaseUSA:=1; end; If TimerFire.Enabled=false then begin phaseUSA:=2; end; PhasenueberpruefungUSA; end;
procedure TForm1.PhasenueberpruefungUSA; begin case phaseUSA of 1: begin IFireUSA.Left:=IFireUSA.Left-8; end; 2: begin zeitUSA:=0; zeitUSA:=zeitUSA+1; IFireUSA.Left:=ITankUSA.Left; end; end; If IFire.Left>IFireUSA.Left then begin TimerFire.Enabled:=false; If zeitUSA=5 then PhaseUSA:=1; IFire.Left:=IFigure.Left; end;
end; |
Ich hoffe, das war verständlich und jemand kann mir sagen, wo der Fehler ist.
Thx 4 help :D
harryp - Di 26.07.05 23:46
Also, ich weiß nich, wie ihr das seht, aber mir klingt das mit der Variable "phaseUSA" ein bissl kompliziert. Kann man sicherlich kürzen, oder ?
Mal ne Frage am Rande : wieso zählst du die Zeit selber mit hoch ? Stell doch das Timer.Intervall einfach auf die 5 Sekunden - also auf
Timer.Interval := 5000;
bei deinem Form.Create.
Damit könntste dir das ganze komische Zeug sparen und die Prozedur übersichtlich gestalten.
-delphin- - Di 26.07.05 23:54
phaseUSA ist nur die Variable, die eben die Phase ausgelöst von Timer angibt.
Ja aber wie sag ich ihm dann, dass er nicht gleich weiter verschiebt wenns zurück am Startpunkt ist und 5 sec wartet?
harryp - Di 26.07.05 23:59
Trifft der jedes mal sicher auf das andere Image wenn der einmal um die 8 Pixel verschoben wird ?
Versuch mal ob statt > das >= funktioniert.
Ich gucks mir moin - also eher heut - vormittag nochmal an, evtl. haben auch andere bis dahin ihre meinung dazu. ansonsten bis später ;)
Moderiert von
Christian S.: Beiträge zusammengefasst
-delphin- - Mi 27.07.05 10:37
Der wird ja nich einmal um 8 verschoben sondern immer wieder, bis er auf des andere trifft und des passiert sicher irgendwann, ansonsten is game over =)
es geht mir eigentlich nur darum, irgendwo da 5 sekunden pause reinzubekommen deshalb hab ich die phaseUSA:=2 kreiert. bei der wird ja genau das gemacht aber irgendwie funktioniert es net so ganz
Edit:
Man könnts auch einfach so formulieren.. ich suche die Zeile im Sourcecode, die dafür sorgt, dass ers nicht mehr losverschiebt wenns einmal kollidiert und zum startpunkt zurückverschoben worden ist, irgendein TimerUSA.Enabled:=false oder irgendetwas oO
-delphin- - Mi 27.07.05 10:53
Neuer Sourcecode:
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: 24: 25:
| procedure TForm1.TimerUSATimer(Sender: TObject); begin zeitUSA:=zeitUSA+1; case zeitUSA of 50: phaseUSA:=1; end; PhasenueberpruefungUSA; end;
procedure TForm1.PhasenueberpruefungUSA; begin case phaseUSA of 1: begin IFireUSA.Left:=IFireUSA.Left-8; If IFire.Left>=IFireUSA.Left then begin IFireUSA.Left:=ITankUSA.Left; phaseUSA:=2; end; end; 2: begin zeitUSA:=0; end; end; end; |
Gleiches Problem, obwohl doch eigentlich alles geregelt ist^^ Ich habs Interval auf 100 gestellt, deshalb die 50 statt der 5 ;)
harryp - Mi 27.07.05 16:34
Also, wie versprochen hab ich mir das ganze nochmal angesehn.
Davon abgesehen, dass ich deinen Programmcode dennoch viel zu lang finde, ist mir eigentlich 1 Hauptfehler aufgefallen :
bei folgender Zeile :
If IFire.Left>=IFireUSA.Left then
bedenkst du (egal ob > oder >=) nicht, dass das IFire-Image auch noch ne bestimmte Breite hat. Deine Zeile sagt ja aus, wenn das IFireUSA-Image weiter links (bzw. mit dem selben Links-Abstand) ist, dann mache dies und das...
Besser ist sicherlich bei kollision folgendes zu sagen :
If IFireUSA.Left <= (IFire.Left+IFire.width) then
Hab's aber heute auch geschafft das ganze mit relativ wenig Aufwand deutlich zu kürzen.
Grundgedanke dabei : Nehm einfach nen Timer mit dem Interval 5000 und definiere am Anfang eine Konstante (z.B. "start"), die den Wert bekommt, wie der Anfangswert deines IFireUSA.Left. Da lässt sich einiges vereinfachen.Vor allem brauchste dann die Extra-prozedur nicht, was alles auch noch n bissl einfacher und übersichtlicher macht.
Hoffe, ich konnt dir damit helfen, wenn nich - frag einfach mal mit ner private message an mich nach...
harryp - Mi 27.07.05 16:39
-delphin- hat folgendes geschrieben: |
Neuer Sourcecode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| case phaseUSA of 1: begin ... phaseUSA:=2; end; end; 2: begin zeitUSA:=0; end; end; end; |
|
Bin mir jetzt nicht ganz sicher, aber kann sein, dass dein Umstellen im Fall phaseUSA=1 auf phaseUSA=2 dazuführt, dass das Programm gleich zum Fall "2" runterspringt.
Hoffe das wahr jetzt verständlich... :(
Is doch beispielsweise in folgendem Fall auch so :
Delphi-Quelltext
1: 2:
| If a > 1 then a := -a; if a < 1 then a := -a; |
Damit würdeste auch wieder bei deinem Anfangswert landen. Weiß bloß nich, ob das mit der case-syntax auch so is ? (is eher die frage an nen mod, falls mal einer vorbeikommt, klärt mich mal auf, bitte...)
@mods : Falls meine Vermutung falsch sein sollte, könnt ihr diesen einen Beitrag einfach löschen, ok ? Danke :wink:
-delphin- - Mi 27.07.05 19:37
das mit der breite des images ist mir klar, war nur zu faul das noch dazuzuschreiben mittlerweile ist es da.
Mein problem habe ich durch ausprobieren auch gelöst, stehe jetz vor einem anderen, aber das ist ne andre geschichte, wenn ich nich weiterkomme, kann ich ja nochmal einen neuen thread öffnen, ich bedanke mich trotzdem :D
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!