大佬教程收集整理的这篇文章主要介绍了关于cocos2dx播放音效的bug以及修正方法,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
游戏开发的时候用到了sfx作为报警音一直looping, 然后发现了个问题,报警音在响了一段时间后消失了, 其中没有触发任何事件
后来我模拟了这个环境, 在场景初始的位置开始播放报警音
CocosDenshion::SimpleAudioENGIne::sharedENGIne()->playEffect("sfx_timesup.wav",truE);
CocosDenshion::SimpleAudioENGIne::sharedENGIne()->playEffect("sfx_bt.wav",falsE);
#include "HelloWorldScene.h" #include "SimpleAudioENGIne.h" USING_NS_Cc; CCScene* HelloWorld::scene(){ CCScene *scene = CCScene::create(); HelloWorld *layer = HelloWorld::create(); scene->addChild(layer); return scene; } bool HelloWorld::init(){ if ( !CCLayer::init() ) { return false; } CocosDenshion::SimpleAudioENGIne::sharedENGIne()->playEffect("sfx_timesup.wav",truE); CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize(); CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "CloseNormal.png","CloseSELEcted.png",this,menu_SELEctor(HelloWorld::menuCloseCallBACk)); pCloseItem->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); pCloseItem->setScale(10); CCMenu* pMenu = CCMenu::create(pCloseItem,null); pMenu->setPosition(CCPointZero); this->addChild(pMenu,1); return true; } void HelloWorld::menuCloseCallBACk(CCObject* pSender){ CocosDenshion::SimpleAudioENGIne::sharedENGIne()->playEffect("sfx_bt.wav",falsE); }
后来找到cocos2dx引擎代码里面音频部分, 不断调试, 发现每次播放音效都会自加1, 一共分配给sfx 32个通道,而且对于每个通道默认并不检测是否正在播放或者循环
于是发现了个参数 nonInterruptible 不中断, 这个变量如果为true的话, 会进行playing检测, 默认初始化又是false, 我想这点效率没必要节省当成默认值吧, 或者有可能是引擎本身不完善, 而强制覆盖旧音效的吧,不过内部也提供了方法来开启这个参数, 不用去修改初始化,找到CDAudioManager.m这个文件的init初始化代码
然后在:
soundENGIne = [[CDSoundENGIne alloc] init];
后面加上一句
[soundENGIne setsourceGroupNonInterruptible:0 isnonInterruptible:TRUE];
这是我的求助帖,当然也是自己解决的,也谢谢cocos2d开发者的协助
https://stackoverflow.com/questions/26945149/there-has-a-bug-with-openal-or-cocos2dx
废话:在这里面找断点很难找,他们的数组,数值,结构都是直接用malloc直接分配的,搞得找断点十分费劲, 唉~~
以上是大佬教程为你收集整理的关于cocos2dx播放音效的bug以及修正方法全部内容,希望文章能够帮你解决关于cocos2dx播放音效的bug以及修正方法所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。