2014-01-16 16 views
1

我正在使用C++进行游戏,并且有一个玩家对象和一个子弹对象。我有两种类型的对象,早在我的代码,像这样定义一个std :: vector的集合:在C++向量中变为null的对象<Object*>

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)时,当我看到下面的注释部分(“//这是哪里得到了WEIRD FOR PLAYER 2”)时,我注意到子弹是NULL并且玩家是NULL以及。在调用该玩家的更新方法和将子弹拉出的位置之间,出现了可怕的错误。

我一直在调试这几个小时了,我想知道我在想什么。

谢谢!

回答

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

哦哇。我不能相信我错过了这一点。时间多喝咖啡。感谢关于C++ 11的提示!我刚开始使用'11,还有很多很酷的新东西要学习! – lxndragreat

+0

....从如何形成一个测试用例开始。 http://kera.name/articles/2013/10/nobody-writes-testcases-any-more/这是你本周剩下的时间_only_工作! –