我正在使用C ++开发游戏,并拥有一个玩家对象和一个子弹对象。我有两种对象的std :: vector集合,在我的代码中先前定义如下:
std::vector<Player*> players;
std::vector<Bullet*> bullets;
我的问题发生在我的主游戏循环中,我在那里执行所有更新逻辑。使用for循环检查每个玩家并更新他,我得到他产生的任何子弹并将它们添加到子弹矢量。
// update players
for (int i = 0; i < players.size(); ++i){
Player *player = players[i];
player->Update(delta);
// get bullets
for (int b = 0; b < player->Bullets.size(); ++b){
// THIS IS WHERE THINGS GET WEIRD FOR PLAYER 2
Bullet *bull = player->Bullets[i];
bullets.push_back(bull);
}
player->Bullets.clear();
}
虽然我的第一个玩家工作得很好 - 他可以随心所欲地射击 - 当你到达第二个玩家时,让他射击会在我迭代子弹矢量时导致EXC_BAD_ACCESS。当我使用调试器(使用Xcode)时,当我到达我的注释下面的部分时(“//这就是玩家2的所有内容”),我注意到子弹为NULL且播放器为NULL同样。在调用该玩家的更新方法和我将子弹拉出的地方之间,事情发生了可怕的错误。
我现在已经调试了好几个小时了,我想知道我错过了什么。
谢谢!
答案 0 :(得分:4)
这是一个简单的错字:
Bullet *bull = player->Bullets[b];
^ not i
使用基于范围的循环(C ++ 11或更高版本)可以避免这种错误:
for (Player * player : players) {
player->Update(delta);
for (Bullet * bullet : player->Bullets) {
bullets.push_back(bullet);
}
player->Bullets.clear();
}
和/或用
替换内循环bullets.insert(bullets.end(), player->Bullets.begin(), player->Bullets.end());