Du bist nicht angemeldet.

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

1

27.08.2011, 17:37

Zur Sicherheit eine Frage

Hallo!
Rein zur Sicherheit frage ich hier mal nach. Sicher kennt jeder "Space Invaders". (wer nicht, sollte Google nutzen)
Ich will, dass alle Gegner eins herunter gehen, wenn einer an einem gewähltem Wert platziert ist, also sich dahinbewegt und den gewählten Wert überschritten hat.
Dies möchte ich so erreichen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
for(EnemyIt = EnemyList.begin(); EnemyIt != EnemyList.end(); ++EnemyIt)
{
    if(EnemyIt->m_EnemyVector.x==756.f)
    {
        for(EnemyIt = EnemyList.begin(); EnemyIt != EnemyList.end(); ++EnemyIt)
            EnemyIt->SetPosition(sf::Vector2f(EnemyIt->m_EnemyVector.x, EnemyIt->m_EnemyVector.y+=32.f));
    }
}


Ist das der richtige Gedanke? Möchte es gerne wissen, bevor ich das testen würde. :D

MfG
Check

2

27.08.2011, 18:17

Nach der 2. For Schleife (noch im if block) solltest du noch ein break reinhauen um die erste Schleife auch zu verlassen, denn wenn mehrere auf dieser Höhe sind würdest du die 2. Schleife mehrfach unnötig durchlaufen bzw. ist es sogar möglich, dass dann nach dem ganzen Alle Gegner nicht nur um 32.f versetzt wurden, sondern sogar um 64, 96, 128.... Außerdem sparst du mit dem break etwas Zeit.

lg chaia

3

27.08.2011, 18:33

Stimmt!
Ja das wäre blöd gelaufen. Aber an sich wäre das richtig?

MfG
Check

ridens

Frischling

Beiträge: 47

Beruf: Freiberuflicher Entwickler

  • Private Nachricht senden

4

27.08.2011, 19:42

Für mich sieht das so gut aus, abgesehen von einer Sache.

Ich habe den Fall selbst in C++ noch nicht ausprobiert, aber ich glaube momentan wird die innere Schleife deine Variable EnemyIt der äußeren überschreiben, sodass dann die äußere Schleife am Ende der inneren einen EnemyIt bekommt der bereits ==EnemyList.end() ist. Dann kommt die Inkrementierung, und ich weiß nicht was der Iterator dann macht. Nach meinem Verständnis sollte er inkrementiert werden und dann über die Liste hinaus zeigen, sodass beim Weiteriterieren niemals nochmal EnemyList.end() erreicht wird und du in einer Endlosschleife steckst.

Wie gesagt, ich bin mit dem Verhalten vom Iterator an der Stelle nicht vertraut, von daher dürfen gerne mehr erfahrene Leute kommen und mich korrigieren :) Sicher würde es aber auch für den Code-Leser nur zur Verständlichkeit beitragen, wenn die innere Schleife einen eigenen Iterator bekommt.

5

27.08.2011, 19:51

Aber beim Zweitem mal wird er doch "zurückgesetzt"?

MfG
Check

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

6

27.08.2011, 20:03

ridens hat schon recht.
Angenommen deine Liste hat 10 Elemente.
Jetzt gehst du shcön durch, und bei Element nr. 5 trifft die Bedingung zu. EnemyIt zeigt also gerade auf das 5. Objekt.
In der Bedingung benutzt du auch EnemyIt, als Zähler, gehst alle Element der Liste durch. D.h. danach zeigt EnemyIt auf das Ende der Liste.
Dann wird in der äußeren for-Schleife der letzte Abschnitt (das hochzählen) ausgeführt.
EnemyIt zeigt jetzt auf Müll, da es vorher ja schon auf das Ende der Liste gezeigt hat. Die Bedingung
EnemyIt != EnemyList.end() ist dadurch weiterhin erfüllt. D.h. du hast 1. gar nicht alle Elemente überprüft und 2. hast du eine Endlosschleife bzw. einen Crash^^
Du brauchst für die innere for-Schleife einen eigenen Iterator.

7

27.08.2011, 20:12

Aber beim Zweitem mal wird er doch "zurückgesetzt"?

MfG
Check


Nein, denn der 1. Teil der For-Schleife wird nur beim 1. Mal ausgeführt.

8

27.08.2011, 20:27

Hmm.... Okay. Gut das ich jetzt erst die Enemy-Klasse schreibe!
Danke Leute. :D

MfG
Check

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

9

27.08.2011, 20:35

== bei float kann schiefgehen, dann wird die Bedingung nie erfuellt. Ich wuerde lieber nur int verwenden oder eine Statemachine.

10

27.08.2011, 20:42

Ja, statt ==-Operator >=-Operator, wichtige Kleinigkeit.

MfG
Check

Werbeanzeige