我正在尝试实现一个太空入侵者游戏,现在我正在尝试检查子弹是否击中了入侵者,然后将其删除。
只有在我尝试射杀该行中的最后一个入侵者时才会出现异常。 例如,如果我只有一排和 8 个入侵者,最后一个,当子弹击中它时,我无一异常(exception)地得到了一个奇怪的边界。
初始化是这样的,用伪代码:
struct Invaders_t
{
vector<Invader*> *invaders;
}
for (int j = 0; j < 1; j++)
{
x_spacing = 15;
for (int i = 0; i < 8; i++)
{
Invader *invader = new Invader();
g_Invaders.invaders->push_back(invader);
}
对于每一帧:
for (int x = 0; x < 1; x++)
{
for (int y = 0; y < 8; y++)
{
Invader *pInvader = (*(g_Invaders.invaders))[x*8 + y];
if (pInvader != nullptr && pInvader->AlienAtals->GetImage() != nullptr)
{
for (list<Bullet*>::iterator it = ship->Bullets->begin(); it != ship->Bullets->end(); it++)
{
float left = (*it)->Position.x - 5;
float top = (*it)->Position.y - 13;
if (CheckCollision(left, top, pInvader->AlienSprite->m_X, pInvader->AlienSprite->GetImage()->GetWidth()/4
, pInvader->AlienSprite->m_Y, pInvader->AlienSprite->GetImage()->GetHeight()/4))
{
std::vector<Invader*>::iterator iter = g_Invaders.invaders->begin();
std::advance(iter, (x *8) + y);
Invader *invader = *iter;
g_Invaders.invaders->erase(iter);
delete invader;
}
}
}
}
}
最佳答案
当你删除一个入侵者时(g_Invaders.invaders->erase(iter);
),vector 的大小减少 1(iter
后 vector 的所有元素移位向开头移动 1 个位置,填充空白空间)。您的代码没有预料到这一点,并继续迭代 vector ,就好像仍然有完整的元素集一样。
关于c++ - 获取非常奇怪的数组边界异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28131030/