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

1

19.11.2011, 00:49

std::list<sf::Sprite> iterator problem

Hallo wie kann ich es am besten anstellen um sprites aus einer lüst zu nehmen und zu überprüfen ob diese noch auf dem bildschirm zu sehen sind? wenn nicht sollen diese gelöscht werden. Bin dabei ein moorhuhn klon zu erstellen, diese werden zwar "gespawnt" allerdings hab ich sie nochnicht gelöscht und nachner zeit wird das spiel immerlangsamer logischer weise.

C-/C++-Quelltext

1
2
3
4
5
6
7
void Game::CheckPosition()
{
    for(it = ChickenSpawn.begin();it != ChickenSpawn.end();++it)
        {
            
        }
}


soweit bin ich allerdings bin ich mir nicht sicher ob ich einfach in der for schleife noch eine if bedingung reinsetzten kann so wie:

if(it->getposition().x <= 100)
{
....
}

wenn das klappen würde weis ich halt immernoch nicht wie ich diesen speicher wieder freigebe/ das sprite lösche

danke im vorfeld ^^
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

19.11.2011, 09:24

Klar kannst du ein if-Statement in deiner Schleife unterbringen. Entfernen kannst du Elemente aus der Liste über list::erase
@D13_Dreinig

3

19.11.2011, 09:57

So wie es sich anhört nimmst du für jedes Bild auf dem Bildschirm ein Extra Sprite? Ich denek aber mal die Wiederholen sich Ständig. Wenn das der Fall ist solltest du nochmal dein Konzept überdenken.
Man kann für mehrere gleiche Sprites auf dem Bildschirm, ein und das selbe Sprite her nehmen. Du must jeweils nur schaun ob die Zeit abgelaufen ist, die das "Mohrhuhn" da ist oder ob es abgeschossen wurde.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

4

19.11.2011, 10:18

wie kann ich es am besten anstellen um sprites aus einer lüst zu nehmen und zu überprüfen ob diese noch auf dem bildschirm zu sehen sind?

Die Sprites sind nichtmehr zu sehen wenn du sie nichtmehr zeichnest.

So wie es sich anhört nimmst du für jedes Bild auf dem Bildschirm ein Extra Sprite? Ich denek aber mal die Wiederholen sich Ständig. Wenn das der Fall ist solltest du nochmal dein Konzept überdenken.
Man kann für mehrere gleiche Sprites auf dem Bildschirm, ein und das selbe Sprite her nehmen.

Sprites sind genau dafür da. Pro Objekt ein Sprite zu haben ist genau richtig.

Allerdings würde ich die Sprites nicht direkt in einer Liste speichern sondern in einer Klasse kapseln. Die Moorhühner bestehen ja nicht nur aus einem Sprite, sie haben eventuell eine bestimmte Flugrichtung, verschiedene Verhaltensweisen und müssen sich merken, ob sie abgeschossen wurden damit du sie löschen kannst. Das gehört nicht in die Gameklasse.
"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

5

19.11.2011, 14:19

Klar kannst du ein if-Statement in deiner Schleife unterbringen. Entfernen kannst du Elemente aus der Liste über list::erase


auf erase bin ich auch schon gekommen allerdings wenn ich dann ChickenSpawn.erase(it); einbaue kommt sofort die fehlermeldung iterator out of range

und das mit der klasse für das moorhuhn kommt noch wollte es erstmal einfach halten, und gucken wie ich die sprites auf gültigkeit überprüfen und löschen kann.
"He who sacrifices freedom for security deserves neither."
Benjamin Franklin

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

19.11.2011, 14:23

http://www.cplusplus.com/reference/stl/list/erase/
Du musst eben auch

C-/C++-Quelltext

1
it = ChickenSpawn.erase(it);
machen.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

FreezingEngine

Treue Seele

  • »FreezingEngine« ist der Autor dieses Themas

Beiträge: 280

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

7

19.11.2011, 14:28

ok und das war der entscheidende Tipp danke ;D danke an alle die mitgeholfen haben.
"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

8

19.11.2011, 15:30

Wenn du erase benutzt darfst du in dem Schleifendurchlauf nicht mehr inkrementieren.
"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?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

19.11.2011, 17:49

Wenn du erase benutzt darfst du in dem Schleifendurchlauf nicht mehr inkrementieren.


Deshalb muss der Iterator neu zugewießen werden. Hat Architekt ja schon gesagt.
@D13_Dreinig

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

10

19.11.2011, 18:07

Ja, da wird oft vergessen, dass es nichtmehr getan werden darf. Ist mir selbst schon ein paar mal passiert xD
"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?

Werbeanzeige