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

崩溃提示:

...全文
1583 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() 这个不是多线程,只是加了一个回调函数到其系统每帧更新的地方去调用而已 所以不会有多线程问题,建议调试一下崩溃的地方
内容概要:本文基于Matlab/Simulink平台,对电励磁同步电机在异步牵入、稳态运行及能耗制动三个阶段的全周期动态特性进行建模仿真与系统研究。研究构建了完整的电机数学模型与仿真系统,重点分析了电机从异步启动到同步运行的过渡过程、稳态运行时的电磁与机械性能,以及执行能耗制动时的减速特性与能量耗散机理。通过仿真,揭示了励磁电流、负载转矩与转速在不同工况下的动态响应规律与耦合关系,为电机的控制策略设计与性能优化提供了理论依据和数据支持。; 适合人群:具备电机学、电力电子与电力拖动基础知识的电气工程及相关专业的研究生、科研人员与工程技术人员。; 使用场景及目标:①研究电励磁同步电机的启动特性,解决异步牵入过程不稳定或失败的问题;②分析电机在不同负载下的稳态运行性能,优化运行效率;③设计和验证能耗制动策略,精确控制制动过程的减速时间和能量消耗。; 阅读建议:在学习过程中,应结合电机的基本原理,深入理解仿真模型中各模块(如电机本体、励磁控制、负载模型)的搭建逻辑,并通过调整仿真参数(如励磁电压、负载大小)来观察和分析系统动态响应,以加深对电机全周期运行特性的理解。

8,324

社区成员

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

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