cocos2dx中的更新函数最近在做一个打飞机游戏demo,在子弹类中使用scheduleUpdate()每一帧调用更新函数upda
cocos2dx中的更新函数
最近在做一个打飞机游戏demo,在子弹类中使用scheduleUpdate()每一帧调用更新函数update()。在update()里主要做两件事,第一,子弹向上移动。第二,判断子弹有没有和敌机相撞,若相撞,则做一些相应地处理。结果,在第二部分里,程序崩溃。
我的问题是,打飞机游戏中不可避免地会同时存在多个子弹对象,那么每一帧就有多个子弹对象的update()函数被调用,这个调用过程是什么样的?先调用哪一个对象的update()函数?在执行某一个update()函数内的语句时,会不会在中间插入其它对象update()函数内的语句?这里有没有涉及多线程问题?
附update()函数
[解决办法]这个东西一看 第一印象就是数组索引超过数组大小
enemyArray->removeObject(enemy); 会改变其大小,当大小改变了 enemyArray->count()会变小
i!=enemyArray->count() 这个这么写不太安全
先改成 i< enemyArray->count()稳点
我建议修改成
void Bullet::update(float dt)
{
this->setPosition(ccpAdd(this->getPosition(),ccp(0,speed)));
CCArray * enemyArray = World::sharedWorld()->getArrayForEnemy();
for(int i=0;i<enemyArray->count();)
{
Enemy * enemy =(Enemy*) enemyArray->objectAtIndex(i);
if(enemy->boundingBox().intersectsRect(this->boundingBox()))
{
enemyArray->removeObject(enemy);
World::sharedWorld()->removeChild(enemy,true);
World::sharedWorld()->removeChild(this,true);
}
else
++i;
}
}
scheduleUpdate() 这个不是多线程,只是加了一个回调函数到其系统每帧更新的地方去调用而已 所以不会有多线程问题,建议调试一下崩溃的地方
[解决办法]不要一边遍历一遍删除
for(int i=0;i!=enemyArray->count();++i)
{
enemyArray->removeObject(enemy);
}
你这样会导致错误的