这个震动需要调用adnroid系统的方法,所以需要C++调用java,JNI这里就不多做介绍了,需要的可以自己去查找下相关资料,如果你只是需要实现这个功能,相信你看完本文,应该就OK了!

1.首先,修改你的android项目的AndroidManifest.xml文件,给app增加震动权限

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.cocos2dx.application"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7"android:targetSdkVersion="8"/>
    <!--....-->
    <!--add line-->
    <uses-permission android:name="android.permission.VIBRATE" />
</manifest>

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项目中CocosDenshionandroidjni文件夹下的SimpleAudioEngineJni.h和SimpleAudioEngineJni.cpp方法

 
#ifndef __SIMPLE_AUDIO_ENGINE_JNI__
#define __SIMPLE_AUDIO_ENGINE_JNI__
#include
extern"C"
{
    ......
    // add these menthod
    externvoidvibrateJNI(longlongtime);
    externvoidvibrateWithPatternJNI(longlongpattern[],intrepeat);
    externvoidcancelVibrateJNI();
}
#endif // __SIMPLE_AUDIO_ENGINE_JNI__
// add these jni menthod
void vibrateJNI(long longtime)
{
    JniMethodInfo methodInfo;
    if(!getStaticMethodInfo(methodInfo,"vibrate","(J)V"))
    {
        return;
    }
    methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,time);
    methodInfo.env->DeleteLocalRef(methodInfo.classID);
}

void vibrateWithPatternJNI(long longpattern[], int repeat)
{
    JniMethodInfo methodInfo;
    if(!getStaticMethodInfo(methodInfo,"vibrateWithPattern","([JI)V"))
    {
        return;
    }
    int elements=sizeof(pattern);
    jlongArray jLongArray=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()
{
    JniMethodInfo methodInfo;
    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 longtime);
void vibrateWithPattern(long longpattern[],int repeat);
void cancelVibrate();

3.3修改CocosDenshion/android/SimpleAudioEngine.cpp增加调用JNI的如下方法。

 
void SimpleAudioEngine::vibrate(long longtime)
{
    vibrateJNI(time);
}
void SimpleAudioEngine::vibrateWithPattern(long longpattern[],intrepeat)
{
    vibrateWithPatternJNI(pattern, repeat);
}
void SimpleAudioEngine::cancelVibrate()
{
    cancelVibrateJNI();
}

4.至此,代码上的修改都OK啦,在游戏中需要使用震动的地方调用。

CocosDenshion::SimpleAudioEngine::sharedEngine()->vibrate(time);
CocosDenshion::SimpleAudioEngine::sharedEngine()->vibrateWithPattern(pattern, repeat);

Cancle Vibrate Using this!

CocosDenshion::SimpleAudioEngine::sharedEngine()->cancelVibrate();

5.如果需要修改后的代码,请移步原帖。

相关文章: