首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

cocos2dx中的更新函数解决办法

2013-12-29 
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);
}
你这样会导致错误的

热点排行