zoukankan      html  css  js  c++  java
  • cocos2d-x3.2中加入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();

    最后在中加上这个

    Coco2dxHelper.java中

    public static void vibrate(long time)
    {
    sCocos2dSound.vibrate(time);
    }

    public static void vibrateWithPattern(long[] pattern, int repeat) {
    sCocos2dSound.vibrateWithPattern(pattern, repeat);
    }
    /**
    * 取消震动


    到这里就圆满完毕了,网上的教程没有最后一步。所以说最后一步尤其关键。

    本人cocos2dx 2.x和3.x的源代码淘宝地址(欢迎大家光顾):https://shop141567464.taobao.com/?spm=a313o.7775905.1998679131.d0011.pzUIU4


    不懂的能够加我的QQ群: 239982941(cocos2d-x 3.x学习群)欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~


  • 相关阅读:
    操作系统精髓读书笔记
    springboot 项目中读取资源文件内容 如图片、文档文件
    重构-改善既有代码的设计读书小结
    投资中最简单的事读书笔记
    公司的行业差异
    Linux-TCP之深入浅出send和recv
    Linux-socket的close和shutdown区别及应用场景
    C-pthread_cond_wait 详解
    Linux-文件描述符的本质及与文件指针的区别
    数据结构-树的进化及与数据库的关系
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5157456.html
Copyright © 2011-2022 走看看