Autor Beitrag
-delphin-
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Di 26.07.05 23:35 
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.

ausblenden volle Höhe 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
  1begin
    IFireUSA.Left:=IFireUSA.Left-8;
     end;
  2begin
    zeitUSA:=0;
    zeitUSA:=zeitUSA+1;
    IFireUSA.Left:=ITankUSA.Left; //<- Rückversetzen zum Ausgangspunkt
     end;
  end;
  If IFire.Left>IFireUSA.Left then //<- Bei Kollision mit anderem Image...
    begin
      TimerFire.Enabled:=false;
      If zeitUSA=5 then
      PhaseUSA:=1;
      IFire.Left:=IFigure.Left; //<- anderes Image zurück zum Ausgangspunkt
    end;

end;


Ich hoffe, das war verständlich und jemand kann mir sagen, wo der Fehler ist.

Thx 4 help :D
harryp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 9

Win 8.1
Delphi 7, XE8
BeitragVerfasst: 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 9

Win 8.1
Delphi 7, XE8
BeitragVerfasst: 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 user profile iconChristian S.: Beiträge zusammengefasst
-delphin- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: Mi 27.07.05 10:53 
Neuer Sourcecode:

ausblenden 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//<-5 sec warten dann verschieben (Phase 1)
  end;
  PhasenueberpruefungUSA;
end;

procedure TForm1.PhasenueberpruefungUSA;
begin
  case phaseUSA of
  1begin
    IFireUSA.Left:=IFireUSA.Left-8;    //<-Hier verschieben
    If IFire.Left>=IFireUSA.Left then
    begin
      IFireUSA.Left:=ITankUSA.Left;  //Zurück auf Startniveau
      phaseUSA:=2//Phase soll 2 sein
     end;
    end;
  2begin
    zeitUSA:=0//Zeit auf 0, damit er wieder 5 sec braucht bis er auf 50 ist, dann würde er wieder verschieben
     end;
  end;
end;


Gleiches Problem, obwohl doch eigentlich alles geregelt ist^^ Ich habs Interval auf 100 gestellt, deshalb die 50 statt der 5 ;)
harryp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 9

Win 8.1
Delphi 7, XE8
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 52
Erhaltene Danke: 9

Win 8.1
Delphi 7, XE8
BeitragVerfasst: Mi 27.07.05 16:39 
user profile icon-delphin- hat folgendes geschrieben:
Neuer Sourcecode:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
case phaseUSA of
  1begin
      ...
      phaseUSA:=2
     end;
    end;
  2begin
    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 :

ausblenden 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- Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 200



BeitragVerfasst: 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