cocos2d 播放两次音效最多可以播放多少音效

cocos2d-之音乐背景播放
cocos2d-之音乐背景播放
1.先添加头文件
#include &SimpleAudioEngine.h&
using namespace CocosD//为了方便下面的函数使用,使用命名空间
2.在init()函数里面添加代码:
&&& //(有些新手)在执行下面的代码,出现无法识别SimpleAudioEngine的原因就是没有加载SimpleAudioEngine.h头文件。
&&& SimpleAudioEngine::sharedEngine()-&preloadBackgroundMusic(&F:/mp3/骆集益-仙剑奇侠传四背景音乐之战斗曲二.mp3&);
&& //预加载,这句话,看你需求怎么,可以不要
&&& SimpleAudioEngine::sharedEngine()-&playBackgroundMusic(&F:/mp3/骆集益-仙剑奇侠传四背景音乐之战斗曲二.mp3&,true);
&& //播放,true代表为循环播放。
下面是播放一些音效
& //预加载背景音乐
&&SimpleAudioEngine::sharedEngine()-&preloadBackgroundMusic( &F:/mp3/骆集益-仙剑奇侠传四背景音乐之战斗曲二.mp3& );
&&//播放背景音乐
&&SimpleAudioEngine::sharedEngine()-&playBackgroundMusic(&F:/mp3/骆集益-仙剑奇侠传四背景音乐之战斗曲二.mp3&);
&&//预加载音效
&&SimpleAudioEngine::sharedEngine()-&preloadEffect(&F:/mp3/骆集益-仙剑奇侠传四背景音乐之战斗曲二.mp3&);
&&//播放音效
&SimpleAudioEngine::sharedEngine()-&playEffect(&F:/mp3/骆集益-仙剑奇侠传四背景音乐之战斗曲二.mp3&);
&3.这也算是一个重要的步骤,那就是释放操作,我们进行播放的时候,
内部代码进行了初始化的操作,
而程序关闭后,默认不会帮我们进行释放,
所以我们结束后程序之前,需要自己去释放。
(其实对于熟悉dx 和opnegl的都会知道进行这个操作,因为我们曾自己写过算比较底层的操作,现在我们用的cocos2d封装好的类进行操作,
所以有基础的去学习某个游戏引擎和框架都有作用的)
那怎么操作?
&重写这个函数&& void onExit();
并在里面添加代码
void HelloWorld::onExit()
&SimpleAudioEngine::sharedEngine()-&end();
&CCLayer::onExit();
&下面就是关于能播放的音乐和音效格式的介绍:
&&& &CocosDenshion引擎库实际上是对系统音频API的封装,因此它支持的音频文件格式与平台有关。
& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CocosDenshion支持的音乐格式
&支持的常见文件格式
& mp3、mid、ogg和wav
l&&& 可以播放android.media.
l&&& MediaPlayer所支持的所有格式
& aac、caf、mp3、m4a和wav
l&&& 可以播放AVAudioPlayer
l&&& 所支持的所有格式
&&& mid、mp3和wav
 CocosDenshion支持的音效格式
&& 支持的常见文件格式
&&& Android
& ogg和wav
l&&& 对wav的支持并不完美
& caf和wav
l&&& 可以播放Cocos2d-iPhone
l&&& CocosDenshion所支持的所有格式
l&& Windows
&&& mid和wav

我的热门文章
即使是一小步也想与你分享最近在制作一个音乐类的游戏, 很关键的一环就是需要谱表与音乐播放的时间贴合. 为了能得到游戏音乐的播放时间,按着能尽量不动引擎源码的方法, 比较直接有两种办法:
使用第三方库的游戏音效库, 如
与此同时在Cocos2d-x 3.3的版本更新中也发提供了基于OpenAL的音频接口
cocos2d::experimental::AudioEngine
这两种方法都有各自优缺点:
功能强大, 如支持3D音乐音效
并不算困难的移植, 在CocoaChina2014秋季开发者大会中的演讲中说了对Cocos2d-x的支持
功能强大的反面就是学习成本的增加,而且游戏的在Cocos2d-js的框架下开发的, 所以还样做一层JSB, 所以为了两个API去实现这么多的集成成本有些大.
策划的学习成本的增加.
制作商业游戏的授权费用.
AudioEngine
在Cocos2d-x的版本更新中新加出的AudioEngine的类, 基于OpenAL进行实现, 在应该类中有实现了获取音乐时间和跳到某一时间的API.
优点就不说了, 只说不足:
虽然有了这样的API但是JSB里没有Binding, 需要自己手动添加.
精度不够, 使用getCurrentTime()时间精度只能达到0.1秒, 不足以支持节奏游戏的精度.(虽然可以调整精度, 但是经常会产生闪退的问题)
有Bug, 这个Bug在官方示例中也有, 就是当在播放音乐的时候接到了电话, 音乐永远不会再播放了, 除非杀掉程序.
莫名其妙的音乐实例会消失
好吧, 只有改SimpleAudioEngine了, 经过实验, 音乐的时间精度可以达到需要的要求, 而且jsb也是没问题的
这个资料比较详细的介绍了SimpleAudioEngine的改造, 但是由于时间版本的问题这里的代码还是和实际工程中有些出入.所以还得修改一下(只针对IOS, Android可以自行扩展)
// SimpleAudioEngin.mm
static void static_setBackgroundMusicCurrentTime(float currentTime){
[[SimpleAudioEngine sharedEngine] setBackgroundMusicCurrentTime:currentTime];
static float static_getBackgroundMusicCurrentTime(){
return [[SimpleAudioEngine sharedEngine] getBackgroundMusicCurrentTime];
float SimpleAudioEngine::getBackgroundMusicCurrentTime() {
return static_getBackgroundMusicCurrentTime();
void SimpleAudioEngine::setBackgroundMusicCurrentTime(float currentTime) {
static_setBackgroundMusicCurrentTime(currentTime);
// SimpleAudioEngine_objc.m
-(void) setBackgroundMusicCurrentTime:(float) currentTime {
[am setBackgroundMusicCurrentTime:currentTime]
-(float) getBackgroundMusicCurrentTime{
return [am getBackgroundMusicCurrentTime];
// CDAudioManager.m
-(void) setBackgroundMusicCurrentTime:(float) currentTime {
[self.backgroundMusic.audioSourcePlayer setCurrentTime:currentTime];
-(float) getBackgroundMusicCurrentTime{
return self.backgroundMusic.audioSourcePlayer.currentT
本文目前还没有评论……Nov_Eleven
阅读(1018)
最近在用Cocos2d-js在做一个小游戏,类似flappy bird那种。
每次点击屏幕会播放一个音效,当连续点击好几次后,出现明显的卡帧现象。 从30帧掉到9帧。
查看Cocos2d-js的java的播放音效代码, 在Cocos2dxSound.java文件中,找到doPlayEffect函数。 加入测试时间的代码:
long start = System.currentTimeMillis();
int streamID = this.mSoundPool.play(soundId, this.clamp(leftVolume, 0.0f, 1.0f), this.clamp(rightVolume, 0.0f, 1.0f), Cocos2dxSound.SOUND_PRIORITY, pLoop ? -1 : 0, soundRate);
long end = System.currentTimeMillis();
Log.d("Cocos2dxSound", "play use " + (end - start));
得出的结果是:
可以看到会出现100ms多的调用时间,这应该是造成画面卡顿的原因了。
还有我发现Android循环播放音效在我的手机小米3上是不起作用,只是播放一次。
经过测试,可以缓解调用延迟的方式有:
在update函数里面,每次播放一个静音的音频文件。
这种方式可以明显减少,但是会出现音效没有播放完被静音音效覆盖了。
起一个新的线程来调用播放函数。
class DoPlayEffectThread extends Thread {
int mSoundID;
boolean mL
Cocos2dxSound mC
public DoPlayEffectThread(Cocos2dxSound context, final String pPath, final int soundId, final boolean pLoop, float pitch, float pan, float gain) {
mPath = pP
mSoundID = soundId;
mLoop = pL
mContext =
public void run() {
Log.d("DoPlayEffectThread", "run");
mContext.doPlayEffect(mPath, mSoundID, mLoop, mPitch, mPan, mGain);
在playEffect中调用
public int playEffect(final String pPath, final boolean pLoop, float pitch, float pan, float gain){
Integer soundID = this.mPathSoundIDMap.get(pPath);
int streamID = Cocos2dxSound.INVALID_STREAM_ID;
if (soundID != null) {
// pan = -1 for left channel, 1 for right channel, 0 for both channels
// play sound
//streamID = this.doPlayEffect(pPath, soundID.intValue(), pLoop, pitch, pan, gain);
new DoPlayEffectThread(this, pPath, soundID, pLoop, pitch, pan, gain).start();
这个方法需要牺牲pasueEffect这个功能,因为playEffect这时候不能返回一个soundID,而pauseEffect需要一个soundID作为参赛。还有一个缺点就是连续播放时有时候听起来会不是同步播放的,有延迟。
因为我游戏不用pauseEffect,所以我用第二种方式来解决画面卡顿的问题。总之画面不卡,牺牲一点音效也是没办法了。原文链接:
阅读排行榜您的举报已经提交成功,我们将尽快处理,谢谢!
lua不好调试,可以用windows下的decode试试,直接用它启动cocos2d x编出来的exe文件。
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'

我要回帖

更多关于 cocos2dx 播放音效 的文章

 

随机推荐