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

13.12.2012, 19:10

Problem mit SFML (1.6) Liste!!!

Hallo,

ich weiss nicht genau ob mein Thema in "2D und 3D Grafik" reinpasst?

Ich habe vor ein kleines retrogame nachzustellen. Ein Raumschiff unten die Monster oben aufgereit, die dann abgeschossenw werden müssen.

Nun habe ich meinen Code soweit fertig.

Die Gegner tauchen in einem bestimmten Zeitabstand auf und beziehen eine bestimmte position. Das Raumschiff das man steuert ist bewegungsfähig und kann auch schon Schüsse abfeuern.

DOCH!, ich habe es so geregelt das wenn ein Schuss an den Gegnern vorübergeht und außerhalb des Bildschirmes gelangt gelöscht wird!

Dies funktioniert aber nicht so wie ich das will!

Wenn der Sprite des Schusses den Bildschirmrand berührt Popt eine Fehlermeldung auf: (siehe Anhang "Fehlermeldung")

Die Funktion die ich zum entfernen des Sprites aus der Liste verwende:

Quellcode

1
if(SchussIt->GetPosition().y < 20) { lSchuss.erase(SchussIt); SchussIt = lSchuss.begin();       }



"SchussIt" = std::list<sf:: Sprite>::iterator SchussIt;
"lSchuss" = std::list<sf:: Sprite>lSchuss;

Ich Hoffe ihr versteht was ich sagen will und könnt mir helfen :D!!??


Gruß
»PfnUeL« hat folgendes Bild angehängt:
  • Fehlermeldung.png

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

2

13.12.2012, 19:53

Kann es sein, dass dein Thread, der die Sprites zeichnet und bewegt, versucht, auf die Liste zuzugreifen, während der andere parallel das Sprite löscht?
Wenn sich eine Liste verändert, während sie von woanders aus verändert wird, fliegt dir die Schleife um die Ohren.

3

13.12.2012, 20:23

Hier mal die kommplette for-schleife:


for(SchussIt = lSchuss.begin();SchussIt != lSchuss.end();SchussIt++)
{
SchussIt->Move(0,-200*Fenster.GetFrameTime());

Fenster.Draw(*SchussIt);

if(SchussIt->GetPosition().y < 20)
{
lSchuss.erase(SchussIt);
SchussIt = lSchuss.begin();
}
}

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

4

13.12.2012, 20:52

Geh am besten mit dem Debugger mal die for-Schleife durch und guck dir die einzelnen Werte der list an, sowie den Iterator.

Laut Fehlermeldung ist dein Iterator nicht mehr inkrementierbar -> ungültig.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

5

13.12.2012, 21:18

Wie kann ich denn in Visual studio 2010 express einzelne codeabschnitte debuggen??

FSA

Community-Fossil

  • Private Nachricht senden

6

13.12.2012, 21:21

An der gewünschten Stelle einen Breakpoint setzen (an den Linken Rand klicken->roter Punkt), und F5 drücken.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

7

13.12.2012, 21:21

Rechtsklick auf die entsprechende Startzeile -> Haltepunkt -> Haltepunkt einfügen
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

8

13.12.2012, 21:31

das problem tritt auf, weil du den end() iterator inkrementierst. erase giibt den neuen(und richtigen) iterator zurück.
"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?

9

13.12.2012, 21:33

CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

Kommt in der Überwachung immer wider vor!

was kann ich dagegen tuhen ?

10

13.12.2012, 21:35

das problem tritt auf, weil du den end() iterator inkrementierst. erase giibt den neuen(und richtigen) iterator zurück.
Was genau muss ich dann ändern?? Verstehe nicht ganz was du meinst...

Werbeanzeige