Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-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 35 36 37 38 39 |
void CGame::followPath() { for(i = ClosedList.begin(); i != ClosedList.end(); i++ ) { ElapsedTime = g_pTimer->Get_Elapsed(); if(i->x == static_cast<int>(Enemy.pSprite->GetPosition().x/32) +1) { while((i->x - Enemy.pSprite->GetPosition().x/32) >= 0) { Enemy.pSprite->Move(2*ElapsedTime,0); } } else if(i->x == static_cast<int>(Enemy.pSprite->GetPosition().x/32) -1) { while((Enemy.pSprite->GetPosition().x/32 - i->x) >= 0) { Enemy.pSprite->Move(-2*ElapsedTime,0); } } else if(i->y == static_cast<int>(Enemy.pSprite->GetPosition().y/32) +1) { while((i->y - Enemy.pSprite->GetPosition().y/32) >= 0) { Enemy.pSprite->Move(0,2*ElapsedTime); } } else if(i->y == static_cast<int>(Enemy.pSprite->GetPosition().y/32) -1) { while(( Enemy.pSprite->GetPosition().y/32 - i->y) >= 0) { Enemy.pSprite->Move(0,-2*ElapsedTime); } } } } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Dastan« (04.04.2012, 20:25)
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »rewb0rn« (04.04.2012, 13:58)
Zitat
Ja logisch, du frühstückst das Ganze in einer Schleife ab, d.h. der Rechner freezt solange die Schleife läuft und danach steht dein Spieler an der richtigen Position. Korrekt wäre, nach jedem Zeichenvorgang nur einen oder begrenzt viele Schritte zu machen.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
if ... if... if... if.. // //checken die Richtung und geben einen Wert zurück While... //holt sich den Wert und führt die entsprechende Bewegung aus |
Zitat
Nimm die Whiles aus deinen Schleifen.
Vom Prinzip läuft es so:
Nimm ersten Punkt von der Liste, bewege dann deine Figur um den Wert ihrer Geschwindigkeit in die Richtung des Punktes. Fertig.
Im nächsten Frame das selbe. Ist die Figur irgendwann bei dem Punkt angekommen, kannst du ihn aus der Liste nehmen und es geht mit dem 2ten Punkt der Liste weiter.
Du gehst bei dir in einem Frame die ganze Liste durch und bewegst immer direkt zu dem Punkt. Dadurch wird der ganze Pfad in einem Frame abgelaufen.
Administrator
Zitat
Bei jeder Iteration deiner Game Loop setzt du deinen Spieler mehr und mehr zum aktuellen Knotenpunkt, den du ganz oben in einer Liste speicherst.
(Die Liste ist dann wie folgt aufgebaut: [A, B, C], wobei jeder Buchstabe für einen Knotenpunkt steht.)
Das lässt sich ganz einfach berechnen, denn du hast die momentane Position des Spielers, die Geschwindigkeit (oder Anzahl an Pixel um die der Spieler sich bewegt) und den nächsten Punkt in deiner Liste.
Stimmen die Koordinaten mit denen des Punktes überein, wird dieser aus der Liste gelöscht und an seiner statt tritt der nächstfolgende Knotenpunkt (Stichwort Stack, vllt. ein Begriff?).
Dies geschieht immer weiter, bis die Liste leer ist und dein Spieler somit die Zielposition erreicht hat.
Werbeanzeige