Столкновение двух спрайтов в отдельных списках

Я пытаюсь запрограммировать шутер сверху вниз на SFML, но столкнулся с проблемой. Я довольно новичок в C ++ и программировании в целом, поэтому, пожалуйста, извините грязный код и / или слишком сложные решения.

У меня два std::lists, один содержит случайно появляющихся врагов, другой содержит пули, которые я выпустил. Когда пуля попадает в противника, они оба должны быть стерты, но это не работает.

Вот проблемная часть моего кода:

for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++)
{

//Here would be Monster-Movement

//Collision Monster-Player (MonsterIt = iterator of MonsterList)
if ((MonsterIt -> getPosition().x + 25) >= PlayerX - 25 &&
(MonsterIt -> getPosition().x - 25) <= PlayerX + 25 &&
(MonsterIt -> getPosition().y + 25) >= PlayerY - 25 &&
(MonsterIt -> getPosition().y - 25) <= PlayerY + 25   )
{
MonsterList.erase(MonsterIt);
break;
}window.draw(*MonsterIt);
}

Вот так я и столкнулся с Monster и Player. Это работало нормально, поэтому я попробовал то же самое с Monsters и Lasers:

for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++)
{

//Here would be "Laser-Movement"
//Collision-Laser                               // Doesn't work
if ((MonsterIt -> getPosition().x + 25) >=      //
(LaserIt   -> getPosition().x - 7) &&       //
(MonsterIt -> getPosition().x - 25) <=      //
(LaserIt   -> getPosition().x + 7) &&       //
(MonsterIt -> getPosition().y + 25) >=      //
(LaserIt   -> getPosition().y - 7) &&       //
(MonsterIt -> getPosition().y - 25) <=      //
(LaserIt   -> getPosition().x + 7))         //
{                                               //
MonsterList.erase(MonsterIt);               //
//
LaserList.erase(LaserIt);                   //
//
break;                                      //
}                                               //

window.draw(*LaserIt);
}

Когда я вставляю часть кода, которую я пометил (с // справа), я получаю ошибку «итератор списка без разыменования» во время отладки, как только я снимаю. Когда я вырезаю указанный код, он работает нормально (я могу стрелять, ходить в монстров, и они исчезают и т. Д.). Из-за этого, я думаю, остальная часть моего кода работает.

Итак, возможно ли столкновение между итераторами разных списков?
И если да, то как мне это сделать?

Если вам нужна дополнительная информация или код, пожалуйста, спросите. Буду рад вашей помощи …

2

Решение

Используемый итератор недопустим.

Есть несколько решений ваших проблем. Первый:

for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++)
{
//Here would be Monster-Movement

//Collision Monster-Player (MonsterIt = iterator of MonsterList)

// Collision with laser, inside the loop for monsters
for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++)
{
}

window.draw(*MonsterIt);
}

Это решение не совсем C ++ ish. С ООП вы можете получить намного более понятный код:

class Player
{
public:
int X, Y; // for code simplicity on SO.
};
// ...

Player player;
for(MonsterIt = MonsterList.begin(); MonsterIt != MonsterList.end(); MonsterIt++)
{
MonsterIt->update(player,LaserList);
if(!MonsterIt->isAlive())
{
// Remove monster from list *without* break
}
}

Затем, Monster это класс, подобный следующему:
класс монстр
{
бул живой;
общественности:
bool isAlive () const {вернуть живым; }

        bool collideWithPlayer(Player p) const
{
// Returns whether it collide with player
// ...
}

bool collideWithLaser(Laser l) const
{
// Returns whether it collide with one laser
// ...
}

bool collideWithLasers(LaserList l) const
{
for(LaserIt = LaserList.begin(); LaserIt != LaserList.end(); LaserIt++)
if(collideWithLaser(*LaserIt))
return true;
return false;
}void update(Player p, LaserList l)
{
if(collideWithPlayer(p) || collideWithLasers(l))
alive = false;
else
window.draw(this);
}
};
0

Другие решения

Других решений пока нет …