gpt4 book ai didi

c++ - 对象在 C++ vector 中变为空

转载 作者:行者123 更新时间:2023-11-30 01:55:02 24 4
gpt4 key购买 nike

我正在用 C++ 开发一个游戏,并且有一个玩家对象和一个子弹对象。我有一个用于两种对象的 std::vector 集合,在我的代码前面定义如下:

std::vector<Player*> players;
std::vector<Bullet*> bullets;

我的问题发生在我的主游戏循环中,我在其中执行所有更新逻辑。使用 for 循环检查每个玩家并更新他,我得到他产生的任何子弹并将它们添加到子弹 vector 中。

    // 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();
}

虽然我的第一个玩家工作正常 - 他可以随心所欲地射击 - 当你到达第二个玩家时,让他射击会在稍后迭代子弹 vector 时导致 EXC_BAD_ACCESS。当我逐步使用调试器(使用 Xcode)时,当我到达我的评论下方的部分(“//这就是播放器 2 变得奇怪的地方”)时,我注意到项目符号为 NULL,播放器为 NULL以及。在调用该播放器的更新方法和我取出子弹之间的某个地方,事情变得非常糟糕。

我已经调试了几个小时了,我想知道我错过了什么。

谢谢!

最佳答案

这是一个简单的错字:

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());

关于c++ - 对象在 C++ vector<Object*> 中变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21164482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com