cocos2d-x中的无法使用replaceScene跳转的问题

本文介绍了在cocos2d-x 2.1.3版本中遇到的replaceScene无法正常跳转场景的问题。通过分析发现,由于onEnter函数在场景可见前执行,导致在该函数内立即调用replaceScene会使当前场景在渲染完成后才跳转。解决方案是通过CCSequence添加延迟,确保场景渲染完成后再执行跳转。另外,还提到在CCTextureCache::sharedTextureCache()->addImageAsync()异步加载图片的回调中进行场景替换会导致错误,需在主线程中处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于cocos2d-x 2.1.3开发如下代码:

void LoadScene::onEnter()

{

this->runAction(CCCallFunc::create(this, callfunc_selector(LoadScene::changeScene))));

}


void LoadScene::changeScene()

{

CCDirector::shareDirector()->replaceScene(FightScene::create());

}


发现无论如何运行,清理,都无法按照想法跳转场景FightScene,怀疑n多,修改FightScene,修改changeScene函数调用方式,完全无效,最终怀疑CCCallFunc动作,修改如下:

void LoadScene::onEnter()

{

this->runAction(CCSequence::create(
CCDelayTime::create(.5f),
CCCallFunc::create(this, callfunc_selector(LoadScene::startFight)),
NULL
));

}

顺利跳转。

究其原因,CCNode::onEnter函数,为CCNode加入界面渲染序列时的“事件”。CCScene的onEnter函数会在场景可以“看到”以前就先执行,所以我们也常将之用于场景的一些初始化动作。如果在onEnter中,立即执行了场景转换CCDirector::shareDirector()->replaceScene(),那么,执行场景转换时,当前场景并没有被渲染完成,在replace过后,还会继续执行当前场景的渲染。结果就是,貌似跳转失败。其实,真实的过程是

渲染本场景->跳转->初始化下一场景->继续渲染本场景

原理很简单,但是配合多线程和Action的时候,难免忘记,作此留念


6月6日 更新

如果使用CCTextureCache::sharedTextureCache()->addImageAsync()来进行图片加载,必然加入类似loadImageCallBack(CCObject*)这样的回调来处理图片加载完成的信息,如果在这个回调中直接进行了CCScene的replace,会发现,出现莫名其妙的CCNode::onEnter中resumeAllAction***这样的方法出现报错。

这个就涉及到cocos2d-x的多线程处理了。cocos2d-x的主线程以外的线程一定不能直接或间接触碰OpenGL的内容。偏偏CCTextureCache::sharedTextureCache()->addImageAsync()就是使用子线程加载图片,达到主线程可以查看加载动态加载进度的要求。(同理,如果其他数据内容需要进行加载,也可以自己写个pthread来加载,然后在主线程中显示进度,这部分内容另说)。所以,一定不能在CCTextureCache::sharedTextureCache()->addImageAsync()的回调或者这个回调函数调用到的其他函数中,进行replaceScene一类的OpenGl相关的API。

解决方法,感觉没有什么好的方法,目前只能是在主线程中加入标识变量,然后主线程中使用schedule进行轮询,再处理。

另,使用CCTextureCache::sharedTextureCache()->addImageAsync()加载,在需要加载的图片全部都已经在内存中时,会出现场景无法跳转的问题,原因见楼上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值