cocos2d-x添加android手机震动
[导读]修改cocos2dx\platform\android\java\src\org\cocos2dx\lib下的java文件。首先打开Cocos2dxHelper.java添加一个静态函数
1、实现C++代码
在cocos2dx\platform\android\jni\Java_org_cocos2dx_lib_Cocos2dxHelper.h中添加函数声明
[cpp] view plaincopyprint?extern void VibratorJNI(int vibratorTime); //单位毫秒
extern void VibratorJNI(int vibratorTime); //单位毫秒
在Java_org_cocos2dx_lib_Cocos2dxHelper.cpp中添加函数定义
[cpp] view plaincopyprint?void VibratorJNI(int vibratorTime)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "Vibrator", "(I)V"))
{
t.env->CallStaticVoidMethod(t.classID, t.methodID, vibratorTime);
t.env->DeleteLocalRef(t.classID);
}
}
void VibratorJNI(int vibratorTime)
{
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "Vibrator", "(I)V"))
{
t.env->CallStaticVoidMethod(t.classID, t.methodID, vibratorTime);
t.env->DeleteLocalRef(t.classID);
}
}到此C++部分就结束了。逻辑部分只要调用VibratorJNI()就可以控制android手机震动了。
2、实现android代码
修改cocos2dx\platform\android\java\src\org\cocos2dx\lib下的java文件。首先打开Cocos2dxHelper.java添加一个静态函数
[cpp] view plaincopyprint?public static void Vibrator(int vibratorTime){
Cocos2dxHelper.sCocos2dxHelperListener.Vibrator(vibratorTime);
}
public static void Vibrator(int vibratorTime){
Cocos2dxHelper.sCocos2dxHelperListener.Vibrator(vibratorTime);
}再在该文件的底部的Cocos2dxHelperListener接口增加如下接口(原因:Vibrator需要调用Activity类中调用getSystemService函数 ,本人android不会,可能有其他方法获取Activity对象吧:))
[java] view plaincopyprint?public static interface Cocos2dxHelperListener {
public void showDialog(final String pTitle, final String pMessage);
public void showEditTextDialog(final String pTitle, final String pMessage, final int pInputMode, final int pInputFlag, final int pReturnType, final int pMaxLength);
<SPAN style="BACKGROUND-COLOR: rgb(255,0,0)">public void Vibrator(final int vibratorTime);</SPAN>
public void runOnGLThread(final Runnable pRunnable);
}
public static interface Cocos2dxHelperListener {
public void showDialog(final String pTitle, final String pMessage);
public void showEditTextDialog(final String pTitle, final String pMessage, final int pInputMode, final int pInputFlag, final int pReturnType, final int pMaxLength);
public void Vibrator(final int vibratorTime);
public void runOnGLThread(final Runnable pRunnable);
}接下来实现Cocos2dxHelperListener 中的Vibrator接口,打开Cocos2dxActivity.java,添加如下代码:
[java] view plaincopyprint?public void Vibrator(final int vibratorTime){
Vibrator vib = (Vibrator) this.getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(vibratorTime);
}
public void Vibrator(final int vibratorTime){
Vibrator vib = (Vibrator) this.getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(vibratorTime);
}至此android部分也完成了。。。
-
本人宣布从此博文发出后,我的cocos2dx的引擎从cocos2dx3.1.1跳到cocos2dx3.2,哈哈,其实变化不大的,不碍事~~~
下面来说说在cocos中添加Android手机震动的功能,亲身体验,网上的教程都是渣渣啊,坑比的很,还要看了原帖http://www.cocos2d-x.org/boards/6/topics/8179,全英文的,蛋疼恼火了许久,才解决~~
下面进入正题。相信看完本文,什么问题都ok了!!!!
1、在proj.android这个目录下
AndroidManifest.xml文件,给app增加震动权限
<uses-permission android:name="android.permission.VIBRATE" />
2、修改android项目源文件src/org/cocos2dx/lib/Cocos2dxSound.java增加震动方法,调用android底层振动器
/*** @param time 震动时间*/
public void vibrate(long time) {
Vibratorv = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(time);
}
/** * @param pattern 震动时间数组 EG:{500,200,500,300}*@param repeat 重复次数*/
public void vibrateWithPattern(long[] pattern, int repeat) {
Vibratorv = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(pattern,repeat);
}
/*** 取消震动 */
public void cancelVibrate() {
Vibratorv = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.cancel();
}
3.至此,java项目中的修改就OK啦,下面就是在Cocos2d-x中增加JNI方法让C++去掉用Java的震动方法就OK啦!
3.1.修改 libCocosDenshion项目中cocos2d-xCocosDenshionandroidjni文件夹下的SimpleAudioEngineJni.h和SimpleAudioEngineJni.cpp方法
在SimpleAudioEngineJni.h中添加
#ifndef __SIMPLE_AUDIO_ENGINE_JNI__
#define __SIMPLE_AUDIO_ENGINE_JNI__
#include
extern "C"
{
......
// add thesementhod
extern void vibrateJNI(long long time);
extern void vibrateWithPatternJNI(long long pattern[], intrepeat);
extern void cancelVibrateJNI();
}
#endif // __SIMPLE_AUDIO_ENGINE_JNI__
在SimpleAudioEngineJni.cpp中添加
// add these jni menthod
void vibrateJNI(long long time)
{
JniMethodInfomethodInfo;
if (! getStaticMethodInfo(methodInfo, "vibrate", "(J)V"))
{
return;
}
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, time);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
void vibrateWithPatternJNI(long long pattern[], int repeat)
{
JniMethodInfomethodInfo;
if (! getStaticMethodInfo(methodInfo, "vibrateWithPattern", "([JI)V"))
{
return;
}
int elements = sizeof(pattern);
jlongArrayjLongArray = methodInfo.env->NewLongArray(elements);
methodInfo.env->SetLongArrayRegion(jLongArray, 0, elements, (jlong*) pattern);
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, jLongArray, repeat);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
void cancelVibrateJNI()
{
JniMethodInfomethodInfo;
if (! getStaticMethodInfo(methodInfo, "cancelVibrate", "()V"))
{
return;
}
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
3.2修改CocosDenshion/include/SimpleAudioEngine.h增加如下方法.
void vibrate(long long time);
void vibrateWithPattern(long long pattern[], int repeat);
void cancelVibrate();
3.3修改CocosDenshion/android/SimpleAudioEngine.cpp增加调用JNI的如下方法。
void SimpleAudioEngine::vibrate(long long time)
{
vibrateJNI(time);
}
void SimpleAudioEngine::vibrateWithPattern(long long pattern[], int repeat)
{
vibrateWithPatternJNI(pattern, repeat);
}
void SimpleAudioEngine::cancelVibrate()
{
cancelVibrateJNI();
}
4.至此,代码上的修改都OK啦,在游戏中需要使用震动的地方调用。
CocosDenshion::SimpleAudioEngine::sharedEngine()->vibrate(time);
CocosDenshion::SimpleAudioEngine::sharedEngine()->vibrateWithPattern(pattern,repeat);
取消震动用这个
CocosDenshion::SimpleAudioEngine::sharedEngine()->cancelVibrate();
最后在中加上这个