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

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

31

26.12.2011, 20:21

Hallo liebe Community,
hab (mal wieder-.-) ein Problem mit Listen.
Ich versuche eine Kollision zwischen 2 Listen zu erkennen,
leider bleibt das Spiel nach dem 1 Schuss hängen.
Es liegt 100% an der folgenden Funktion da ohne diese das Spiel nicht hängen bleibt.

Hier mal der Code bzw. Funktion:

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
void InGame::CheckDMG()
{
    Eit = EnemyList.begin();
    Player.it = Player.PlayerShot.begin();

    for(;Eit != EnemyList.end();)
    {
        for(;Player.it != Player.PlayerShot.end();)
        {
            if(Collision::PixelPerfectTest(Eit->Sprite,Player.it->sShot))
            {
                Eit = EnemyList.erase(Eit);
                Player.it = Player.PlayerShot.erase(Player.it);
            }
            else
            {
                Eit++;
                Player.it++;
            }
        }
    }
}


Fehler: List iterator not deferenceable.


MfG Marcel
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

32

26.12.2011, 20:58

Das wundert dich? Die innere Schleife läuft doch weiter...

Übrigens wäre es bestimmt besser für dich, wenn du dir Präinkrement angewöhnst(++Eit; ).
Wieso benutzt du keine while-Schleifen?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

33

26.12.2011, 21:18

Zitat

Wieso benutzt du keine while-Schleifen?


weiß nicht hab ich mir irgendwie angewöhnt das wenn ich mit Listen arbeite for-Schleifen verwende^^

EDIT:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void InGame::CheckDMG()
{
    Eit = EnemyList.begin();
    Player.it = Player.PlayerShot.begin();

    while(Eit != EnemyList.end()&&Player.it != Player.PlayerShot.end())
    {
            if(Collision::PixelPerfectTest(Eit->Sprite,Player.it->sShot))
            {
                Eit = EnemyList.erase(Eit);
                Player.it = Player.PlayerShot.erase(Player.it);
            }

            Eit++;
            Player.it++;
    }
}


Funktioniert nur teilweise, nur manche "Feinde" verschwinden, bei anderen fliegen die Schüsse durch.



1. Ich setze die iteratoren auf begin().
2. while(solange die beiden Listen nicht das Ende erreicht haben )
3. if(Wenn kollision zwischen den Element Sprites, dann beide Elemente(Schuss,Gegner) löschen )
4. else(ansonsten die iteratoren erhöhen)
5. = 2.

Ich find den Fehler nicht xD
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »FreezingEngine« (26.12.2011, 21:47)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

34

26.12.2011, 21:29

Deine Schleife funktioniert so nicht. Überleg dir mal was du da genau machst. Du prüfst immer nur das erste Element von EnemyList.
Das hat auch nichts mit while oder for zutun.
Meine "Tipps" hast du offensichtlich auch nicht befolgt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

35

26.12.2011, 22:42

Kann es sein das die Schleife nicht funktioniert weil ich jeden Gegner mit jedem Schuss überprüfen muss?
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

36

26.12.2011, 22:53

Übrigens wäre es bestimmt besser für dich, wenn du dir Präinkrement angewöhnst(++Eit; ).

Weil? Premature Optimisation?
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]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

37

26.12.2011, 23:17

Übrigens wäre es bestimmt besser für dich, wenn du dir Präinkrement angewöhnst(++Eit; ).

Weil? Premature Optimisation?

Weil ein Anfänger in der Regel das Verhalten vom Präinkrement erwartet. So hab ichs zumindest bis jetzt mitbekommen. Es ist also weniger fehleranfällig und manchmal sogar schneller und es spricht nichts dagegen, bzw. nichts für Postinkrement.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

38

26.12.2011, 23:27

Also habs jetzt auch mit dem ++Eit etc.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Eit = EnemyList.begin();
    Player.it = Player.PlayerShot.begin();

    while(Eit != EnemyList.end()&&Player.it != Player.PlayerShot.end())
    {

            if(Collision::PixelPerfectTest(Eit->Sprite,Player.it->sShot))
             {
               Eit->iLeben -= 15;
               ++Eit;
               Player.it = Player.PlayerShot.erase(Player.it);
             }
              else
               {
                 ++Eit;
                 ++Player.it;
               }

    }


Das funktioniert wie immer nur teilweise
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

39

26.12.2011, 23:43

Du musst die Kollision zwischen jedem Schuss und jedem Gegner prüfen. Momentan prüfst du die Kollision zwischen dem ersten Gegner und dem ersten Schuss, dem zweiten Gegner und dem zweiten Schuss usw.

Dafür benötigst du eine verschachtelte Schleife. Dabei ists egal ob der Gegner oder die Schüsse innen sind. Für den Fall, dass die Schüsse in der inneren Schleife sind, darfst du auch nur ihren Iterator in dieser Schleife inkrementieren und musst den Iterator von den Gegnern in der äußeren Schleife inkrementieren. Wenn du erstmal verstanden hast wieso man das ganze so machen muss wird dir das mit dem erase auch noch gelingen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

40

26.12.2011, 23:44

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
Eit = EnemyList.begin();
    while(Eit != EnemyList.end())
    {
        Player.it = Player.PlayerShot.begin();

        for(;Player.it != Player.PlayerShot.end();)
        {

            if(Collision::PixelPerfectTest(Eit->Sprite,Player.it->sShot))
            {
                Eit->iLeben -= 15;
                Player.it = Player.PlayerShot.erase(Player.it);
            }
            else
            {
                ++Player.it;
            }


        }
        ++Eit;
    }


ok so klappts danke für die Hilfe ^^
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Werbeanzeige