大佬教程收集整理的这篇文章主要介绍了cocos2dx 音频模块分析(1),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
cocos2dx音效的实现分析:
上面那个图是cocos2dx音效部分的实现结构图,总体的思想是:
使用同一个SimpleAudioENGIne.h头文件,然后在不同平台下对应不同
的实现文件,不同平台编译不同的实现文件,这就要求这个类的函数定义
成员在各个平台下统一。其实这也可以理解为一种跨平台的实现方式。
这里分析android部分:
1、预加载背景音乐 void SimpleAudioENGIne::preloadBACkgroundMusic(@R_944_2600@ pszFilePath) { std::string fullPath = getFullPathWithoutAssetsPrefix(pszFilePath); preloadBACkgroundMusicJNI(fullPath.c_str()); } -->> //得到音乐文件的路径,如果是包里的文件,则去掉assets/前缀 static std::string getFullPathWithoutAssetsPrefix(@R_944_2600@ pszFileName) { // Changing file path to full path //获取文件的路径,以后有时间会分析下CCFileUtils这个类的实现 std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(pszFileName); // Removing `assets` since it isn't needed for the API of playing sound. size_t pos = fullPath.find("assets/"); if (pos == 0) { fullPath = fullPath.substr(strlen("assets/")); } return fullPath; } -->> preloadBACkgroundMusicJNI: //这里其实就是调用jni的方法: void preloadBACkgroundMusicJNI(const char *path) { // void playBACkgroundMusic(String,Boolean) JniMethodInfo methodInfo; if (! getStaticMethodInfo(methodInfo,"preloadBACkgroundMusic","(Ljava/lang/String;)V")) { return; } jString StringArg = methodInfo.env->NewStringUTF(path); methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,StringArg); methodInfo.env->deleteLocalRef(StringArg); methodInfo.env->deleteLocalRef(methodInfo.classID); } -->>java端的代码: public static void preloadBACkgroundMusic(final String pPath) { Cocos2dxHelper.sCocos2dMusic.preloadBACkgroundMusic(pPath); } -->> public void preloadBACkgroundMusic(final String pPath) { if ((this.mCurrentPath == null) || (!this.mCurrentPath.equals(pPath))) { // preload new BACkground music // release old resource and create a new one if (this.mBACkgroundMediaPlayer != null) { this.mBACkgroundMediaPlayer.release(); } this.mBACkgroundMediaPlayer = this.createMediaplayer(pPath); // record the path this.mCurrentPath = pPath; } } -->> private MediaPlayer createMediaplayer(final String pPath) { //其实就是创建了一个android下的MediaPlayer媒体播放实例,后面的播放,暂停之类 //的,都是这个实例去控制。 MediaPlayer mediaPlayer = new MediaPlayer(); try { if (pPath.startsWith("/")) { final FileInputStream fis = new FileInputStream(pPath); mediaPlayer.setDatasource(fis.getFD()); fis.close(); } else { final AssetFileDescriptor assetFileDescritor = this.mContext.getAssets().openFd(pPath); mediaPlayer.setDatasource(assetFileDescritor.getFileDescriptor(),assetFileDescritor.getStartOffset(),assetFileDescritor.getLength()); } mediaPlayer.prepare(); mediaPlayer.setVolume(this.mLeftVolume,this.mRightVolumE); } catch (final Exception E) { mediaPlayer = null; Log.e(Cocos2dxMusic.TAG,"error: " + e.getmessage(),E); } return mediaPlayer; } -->>播放背景音乐,这里可以不用预先加载,就直接播放。 void SimpleAudioENGIne::playBACkgroundMusic(@R_944_2600@ pszFilePath,bool bLoop) { std::string fullPath = getFullPathWithoutAssetsPrefix(pszFilePath); playBACkgroundMusicJNI(fullPath.c_str(),bLoop); }
以上是大佬教程为你收集整理的cocos2dx 音频模块分析(1)全部内容,希望文章能够帮你解决cocos2dx 音频模块分析(1)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。