Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

DoooReyn/fmod-for-cocos2dx

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FMOD集成指南

前提

FMOD是为游戏开发者准备的音频引擎,比起Cocos2d-x内置的SimpleAudioEngine,其专业能力超出SimpleAudioEngine好几个量级。长期以来,我们内部使用的一直是SimpleAudioEngine,期间出现过音频无法播放、丢失等问题,为解决SimpleAudioEngine的硬伤,我们决定使用FMOD替换掉SimpleAudioEngine。这篇文章就旨在讲解FMOD集成的过程。

方案

本次集成基于开源方案cocos2d-x-fmod,然而由于cocos2d-x-fmod集成的api过于简陋,没有发挥出fmod应有的强大,比如:设置音量缺失、不区分音乐和音效、不提供重播功能等,因此我在其基础上新增了很多API以适应项目的需要,并尽量向SimpleAudioEngine提供的API看齐。API的扩展在此处不是重点,下面重点说明集成的过程。

一、代码集成

  1. 拉取cocos2d-x-fmod
  2. fmod目录复制到frameworks⁩/cocos2d-x⁩/external
  3. lua_fmod_auto.cpplua_fmod_auto.hpp复制到frameworks⁩/cocos2d-x⁩/cocos/scripting/lua-binding/manual (这里是一个坑,虽然它是auto,但实际上是manual,因此把它丢到manual下)
  4. 修改frameworks/cocos2d-x/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp
    ...
    #include "fmod/lua_fmod_auto.hpp"
    ...
    // 2.register
    bool LuaStack::init(void)
    {
    	...
        register_all_cocos2dx_fmod(_state);
    	...
    	return true;
    }

二、Windows集成

  1. FMODAudioEngine.cppFMODAudioEngine.h添加到libcocos2d工程

  2. lua_fmod_auto.cpplua_fmod_auto.hpp添加到libluacocos2d工程

  3. 配置fmod的附加库目录

  4. 添加fmod的附加依赖项

  5. 编译,成功后需要将fmodL.dll动态库复制到生成目录,否则程序会提示fmodL.dll而运行不起来

三、Android集成

  1. fmod.jar复制到app/libs目录下,并修改app/build.gradle将其添加为库:
// fmod
implementation files('libs\\fmod.jar')
  1. 修改AppActivity.java
	...
	static
	{
		//加载fmodL动态库
		System.loadLibrary("fmodL");
	}
	...
	protected void onCreate(Bundle savedInstanceState) {
	...
	// 初始化fmod
	org.fmod.FMOD.init(this);
	...
	}
	···
	protected void onDestroy() {
		···
		org.fmod.FMOD.close();
		···
		super.onDestroy();
	}
	···
  1. 修改cocos/Android.mk:

    	···
    	LOCAL_STATIC_LIBRARIES += fmod_static
    	···
    	$(call import-module,fmod/prebuilt/android)
    
  2. 修改cocos/scripting/lua-bindings/proj.android/Android.mk:

    	···
    	LOCAL_SRC_FILES += ../manual/fmod/lua_fmod_auto.cpp
    
    	LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../../external/lua/tolua \
    	···
    						$(LOCAL_PATH)/../manual/fmod \
    						$(LOCAL_PATH)/../../../../external/fmod \
    	···
    	LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../../../external/lua/tolua \
    	···
    						$(LOCAL_PATH)/../manual/fmod \
    						$(LOCAL_PATH)/../../../../external/fmod \
    	···
    

四、iOS集成

Config libs

Config search path

1.cocos2d_libs.xcodeproj ▸ ⁨build setting ▸ ⁨User Header Search Paths
"$(SRCROOT)/../external/fmod/include/ios"

2.cocos2d_libs.xcodeproj ▸ ⁨build setting ▸ ⁨Library Search Paths
"$(SRCROOT)/../external/fmod/prebuilt/ios"

Add source file to XcodeProject

Lua接口

engine = fmod.FMODAudioengine:getInstance()

-- preload
engine:reload(path)
engine:preloadMusic()

-- volume
engine:setSoundVolume(1.0)
engine:setMusicVolume(1.0)
engine:getSoundVolume()
engine:getMusicVolume()

-- pitch
engine:setPitch(2.0)
engine:setMusicPitch(2.0)
engine:getPitch()
engime:getMusicPitch()

-- isMusicPlaying
engine:isMusicPlaying()

-- play
nSoundID = engine:playSound(path)
engine:playMusic(path, isLoop)

-- pause
engine:pauseSound(nSoundID)
engine:pauseMusic()
engine:pauseAllSounds(false)

-- stop
engine:stopSound(nSoundID)
engine:stopMusic()
engine:stopAllSounds(false)

-- resume
engine:resumeSound(nSoundID)
engine:resumeMusic()
engine:resumeAllSounds(true)

-- release
engine:releaseSound(path)
engine:releaseMusic()
engine:releaseAllSounds(false)

-- rewind
engine:rewindMusic()

About

cocos2d-x集成fmod

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published
Morty Proxy This is a proxified and sanitized view of the page, visit original site.