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

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

11

01.02.2016, 21:37

Bist du dir sicher, dass du es richtig benutzt. Nachdem du erase aufrufst ist der aktuelle iterator nicht mehr gueltig, d.h. it++ in der Schleife wird danach crashen. Die Beispiele aus der Dokumentation beschreiben ganz gut was da passiert: http://www.cplusplus.com/reference/list/list/erase/

Daher wuerde ich remove_if empfehlen. Du kannst es auch selbst machen, z.B. so:

C-/C++-Quelltext

1
2
3
4
5
6
7
for (auto &it = list.begin(); it != list.end();) {
        if ((*it)->GetSprite().getPosition().y < 400) {
            it = list.erase(it);
        } else {
            it++;
        }
    }

12

01.02.2016, 21:53

Ja jetzt Funktioniert es Danke :)

13

01.02.2016, 22:29

Jetzt habe ich ein anderes Problem. Ich habe die Methode auch für eine Asteroiden klasse verwendet und die Asteroiden die spawnen bekommen immer eine random Geschwindigkeit und wenn der Asteroid der als erstes erstellt wurde von den Asteroiden eingeholt wird der danach erstellt wird wird der zuerst erstellt wurde zerstört. Ich hoffe ihr konntet mir folgen :D

Dieser Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (auto &it = list.begin(); it != list.end();) {

        if ((*it)->sprite.getPosition().y > 700) {

            it = list.erase(it);

        }
        else {

            it++;

        }

    }

14

02.02.2016, 01:39

wenn der Asteroid der als erstes erstellt wurde von den Asteroiden eingeholt wird der danach erstellt wird wird der zuerst erstellt wurde zerstört.

Das bildet dein Code aber nicht ab! Du sagst es soll jeder Asteroid zerstört werden, dessen Position größer 700 ist.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

15

02.02.2016, 09:24

Mir ist noch aufgefallen das die Asteroiden immer doppelt spawnen. Mach ich beim std::unique_ptr was falsch ?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Asteroid::spawn(float delay) {

    if (clock.getElapsedTime().asSeconds() > delay) {

        std::unique_ptr<Asteroid> asteroid(new Asteroid);

        int x = rand() % 750 + 50;
        int moveSpeed = rand() % 150 + 50;
        float scaleList[] = { 0.7f, 1.0f, 1.7f, 1.7f };

        asteroid->init(static_cast<float>(x), 100, static_cast<float>(moveSpeed), scaleList[rand() % 3 + 0]);

        list.push_back(std::move(asteroid));

        clock.restart();

    }

}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

02.02.2016, 09:34

Der Code da zeigt zumindest nicht, warum Du zwei bekommst. Allerdings benutzt Du eine total hässliche init-Methode statt dem Konstruktor. Du kannst auch mal Ausschau nach "make_unique" halten. Oder Du benutzt für Deine Liste von Asteroiden überhaupt kein Heap-Objekt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

17

02.02.2016, 10:19

Habe es mir angeschaut ich habe den Asteroiden jetzt so erstellt.

C-/C++-Quelltext

1
std::unique_ptr<Asteroid> asteroid = std::make_unique<Asteroid>();

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

02.02.2016, 10:39

Und hast aber noch immer die init-Methode. Für Dein eigentliches Problem benutz den Debugger und schau nach, wie oft tatsächlich von wo Asteroiden erzeugt werden. Ich glaube übrigens noch immer nicht, dass Du Heap-Objekte für Asteroiden brauchst.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige