cocos2dx中的更新函数

Jocodeoe 2013-12-22 03:48:01
最近在做一个打飞机游戏demo,在子弹类中使用scheduleUpdate()每一帧调用更新函数update()。在update()里主要做两件事,第一,子弹向上移动。第二,判断子弹有没有和敌机相撞,若相撞,则做一些相应地处理。结果,在第二部分里,程序崩溃。
我的问题是,打飞机游戏中不可避免地会同时存在多个子弹对象,那么每一帧就有多个子弹对象的update()函数被调用,这个调用过程是什么样的?先调用哪一个对象的update()函数?在执行某一个update()函数内的语句时,会不会在中间插入其它对象update()函数内的语句?这里有没有涉及多线程问题?

附update()函数

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();++i)
{
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);
}
}
}

崩溃提示:

...全文
1427 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
无名剑 2013-12-27
  • 打赏
  • 举报
回复
引用 2 楼 Jocodeoe 的回复:
确实是你说的问题,非常感谢。还有一个问题想请教一下,如果同时生成了多个对象,那么在下一帧时刻先执行哪个对象的update()函数呢?顺序是否是随机的?还是按照生成对象的顺序来执行对象的update()函数? [quote=引用 1 楼 wurh80 的回复:] 这个东西一看 第一印象就是数组索引超过数组大小 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() 这个不是多线程,只是加了一个回调函数到其系统每帧更新的地方去调用而已 所以不会有多线程问题,建议调试一下崩溃的地方
[/quote] 这个你在Update的地方打个断点 查下堆栈就会懂了。 void CCDirector::drawScene(void) { // calculate "global" dt calculateDeltaTime(); //tick before glClear: issue #533 if (! m_bPaused) { m_pScheduler->update(m_fDeltaTime); } ... 更新的回调的函数表是一个哈希表,所以这个update 顺序就是遍历哈希表的顺序,我没去仔细研究这份逻辑,猜测应该是不确定的。 你可以去看看
  • 打赏
  • 举报
回复
不要一边遍历一遍删除 for(int i=0;i!=enemyArray->count();++i) { enemyArray->removeObject(enemy); } 你这样会导致错误的
Jocodeoe 2013-12-24
  • 打赏
  • 举报
回复
确实是你说的问题,非常感谢。还有一个问题想请教一下,如果同时生成了多个对象,那么在下一帧时刻先执行哪个对象的update()函数呢?顺序是否是随机的?还是按照生成对象的顺序来执行对象的update()函数?
引用 1 楼 wurh80 的回复:
这个东西一看 第一印象就是数组索引超过数组大小 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() 这个不是多线程,只是加了一个回调函数到其系统每帧更新的地方去调用而已 所以不会有多线程问题,建议调试一下崩溃的地方
无名剑 2013-12-23
  • 打赏
  • 举报
回复
这个东西一看 第一印象就是数组索引超过数组大小 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() 这个不是多线程,只是加了一个回调函数到其系统每帧更新的地方去调用而已 所以不会有多线程问题,建议调试一下崩溃的地方

8,302

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧