2014-01-21, 00:47
  #1
Medlem
for (std::vector<Sprite*>::iterator outerIter = sprites.begin(); outerIter != sprites.end(); outerIter++)
{
Sprite* spriteOne = *outerIter;
for (std::vector<Sprite*>::reverse_iterator innerIter = sprites.rbegin(); innerIter != sprites.rend(); ++innerIter)
{
Sprite* spriteTwo = *innerIter;
if (spriteOne->getRect() != spriteTwo->getRect() && spriteOne->getRect().overlaps(spriteTwo->getRect()))
{
spriteOne->collisionReaction(spriteTwo);
spriteTwo->collisionReaction(spriteOne);
spriteOne->collisionDestroy(sprites);
spriteTwo->collisionDestroy(sprites);
}
if (!spriteOne)
break;
}
}

Det som hnder r att man hoppar in i yttre loopen, sen inre loopen och kr igenom inre loopen en gng. Sedan s ska den hoppa upp och kra inre loopen igen, men dr ger den felet "Expression: vector iterator not decrementable".

Hr r funktionen man kallar p (collisionReaction gr inget annat n att stta lite olika lokala vrden i objecten):

void Enemy::collisionDestroy(std::vector<Sprite*>& sprites)
{
for (std::vector<Sprite*>::iterator iter = sprites.begin(); iter != sprites.end(); iter++)
{
Enemy* tmp = dynamic_cast<Enemy*>(*iter);
if (this == tmp && collisionType == 3 || collisionType == 1)
{
sprites.erase(iter);
break;
}
}
}

Hjlp

EDIT: Ledsen ver ingen indentering, vet inte hur man gr.
Citera
2014-01-21, 01:03
  #2
Medlem
Uran233s avatar
Vad r syftet? Du har en vektor av sprites, som du vill kolla mot varandra? Om de verlappar ska bda "reagera" och frstras?
Citera
2014-01-21, 01:34
  #3
Medlem
Citat:
Ursprungligen postat av Janejja
dr ger den felet "Expression: vector iterator not decrementable"
Om du lgger till eller tar bort element s blir existerande iteratorer felaktiga om datan flyttats till ett nytt minnesomrde. Anvnd indexeringsoperatorn [] eller spara elementen som ska tas bort i en separat vector och ta bort dem efter att du klar med itereringslooparna.
Citera
2014-01-21, 01:54
  #4
Medlem
Citat:
Ursprungligen postat av Janejja
EDIT: Ledsen ver ingen indentering, vet inte hur man gr.

http://www.flashback.org/t2302444
Citera
2014-01-21, 02:23
  #5
Medlem
Citat:
Ursprungligen postat av mongomannen
Om du lgger till eller tar bort element s blir existerande iteratorer felaktiga om datan flyttats till ett nytt minnesomrde. Anvnd indexeringsoperatorn [] eller spara elementen som ska tas bort i en separat vector och ta bort dem efter att du klar med itereringslooparna.

Har ett behov av att lsa det med iteratorer. Fler tips?
Citera
2014-01-21, 03:44
  #6
Medlem
Citat:
Ursprungligen postat av Janejja
Har ett behov av att lsa det med iteratorer. Fler tips?

Anvnd returvrdet frn erase().

Klla: http://stackoverflow.com/questions/3...ntable/3779252
Citera
2014-01-24, 14:00
  #7
Medlem
skyflashs avatar
Att anvnda iteratorn som erhlls frn erase() r dock inte helt trivialt i detta fall med tre olika samtidiga itereringar ver containern. Fundera p att gra en kopia p vektorn. Se ocks upp med minneslckor om "sprites" innehller pekare till dynamiskt allokerade objekt: erase() deallokerar ej sdant minne automatiskt.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in