Я пытаюсь запрограммировать шутер сверху вниз на SFML, но столкнулся с проблемой. Я довольно новичок в C ++ и программировании в целом, поэтому, пожалуйста, извините грязный код и / или слишком сложные решения.
У меня два std::list
s, один содержит случайно появляющихся врагов, другой содержит пули, которые я выпустил. Когда пуля попадает в противника, они оба должны быть стерты, но это не работает.
Вот проблемная часть моего кода:
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);
}
Когда я вставляю часть кода, которую я пометил (с // справа), я получаю ошибку «итератор списка без разыменования» во время отладки, как только я снимаю. Когда я вырезаю указанный код, он работает нормально (я могу стрелять, ходить в монстров, и они исчезают и т. Д.). Из-за этого, я думаю, остальная часть моего кода работает.
Итак, возможно ли столкновение между итераторами разных списков?
И если да, то как мне это сделать?
Если вам нужна дополнительная информация или код, пожалуйста, спросите. Буду рад вашей помощи …
Используемый итератор недопустим.
Есть несколько решений ваших проблем. Первый:
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);
}
};
Других решений пока нет …