cocos2d-x添加android手机震动

来源:互联网 发布:南大碎尸案推理 知乎 编辑:程序博客网 时间:2024/05/17 00:03

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部分也完成了。。。 



cocos2dx3.2中添加Android手机震动

作者:  发布日期:2014-10-14 20:13:33
我来说两句(0)
Tag标签:手机  
  • 本人宣布从此博文发出后,我的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();

    最后在中加上这个

    \

0 0
原创粉丝点击