【问题标题】:How to add vibration to cocos2d-x 3.2 on Android and iOS devices?如何在 Android 和 iOS 设备上为 cocos2d-x 3.2 添加振动?
【发布时间】:2015-01-19 06:18:35
【问题描述】:

我想使用 cocos2d-x 3.2 在我的滑块功能中振动我的设备。

我在官方forums 上关注了一些与此相关的参考链接,但我仍然感到困惑。

谁能帮帮我?

【问题讨论】:

    标签: cocos2d-x cocos2d-x-3.0 android-vibration iphone-vibrate


    【解决方案1】:

    经过大量搜索,我终于完成了 Cocos2d-x 3.2 for android 中的振动功能。

    有一个振动器类。

    Vibrator.h

    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    #include <jni.h>
    #include <android/log.h>
    #include "platform/android/jni/JniHelper.h"
    #endif
    #define  CLASS_NAME "org/cocos2dx/lib/Cocos2dxHelper"
    class Vibrator
    {
    public:
    static void Vibrate(int time);
    static void CancelVibrate();
    };
    #endif
    

    Vibrator.cpp

    #include "Vibrator.h"
    
    void Vibrator::Vibrate(int time)
    {
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    JniMethodInfo t;
    
    if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "vibrate", "(I)V"))
    {
        t.env->CallStaticVoidMethod(t.classID, t.methodID, time);
        t.env->DeleteLocalRef(t.classID);
    }
    #endif
    }
    void Vibrator::CancelVibrate()
    { 
    #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    JniMethodInfo t;
    if (JniHelper::getStaticMethodInfo(t, CLASS_NAME, "cancelVibrate", "()V"))
    {
        t.env->CallStaticVoidMethod(t.classID, t.methodID);
        t.env->DeleteLocalRef(t.classID);
    }
    #endif
    }
    

    => 在 AndroidManifest.xml 中:添加以下权限。

    => 在 src/org/cocos2dx/lib/Cocos2dxHelper.java 文件中:添加以下 2 个方法

    首先导入 => 导入 android.os.Vibrator;

    然后,添加这两个方法

    public static void vibrate ( int vibrateTime)  {
        Vibrator vib = (Vibrator) sActivity.getSystemService (Service.VIBRATOR_SERVICE);
        vib.vibrate (vibrateTime);
    }
    
    public  static  void  cancelVibrate () {
        Vibrator vib = (Vibrator) sActivity.getSystemService  (Service.VIBRATOR_SERVICE);
        vib.cancel ();
    }
    

    现在,每当我们想要使用振动功能时,我们只需要包含这个振动器类并简单地调用它,如下所示。

    Vibrator::Vibrate(50);
    

    为了禁用它,

    Vibrator::CancelVibrate(); 
    

    in 在 Tab 中不起作用,因为它没有 Vibrator。

    【讨论】:

    • 因为 Tab 里面没有振动器。
    【解决方案2】:

    FenneX's github 上应该有一个在 iOS 和 Android 上有效的振动实现。

    头文件在 Classes/FenneX/NativeWrappers/NativeUtility.h.

    iOS implementation is in proj.ios_mac/ios/Misc/NativeUtility.mm

    Android 实现中包含 C++ proj.android/jni/NativeUtility.cpp

    Java somewhere in the src.

    来自forum post 提出同样的问题

    【讨论】:

      【解决方案3】:

      基于forum post中的代码:

      • 您需要在您的 Classes/ 文件夹中添加一个标头,您只需在其中声明但未定义 cpp 函数。
      • 您需要在proj.android/jni 的.cpp 文件中添加一个函数定义。我使用了proj.android/jni/hellocpp/main.cpp,我相信这是启动 cocos2dxv3 项目的默认设置。在此方法中,您调用您在 java 中定义的方法,在这种情况下,它被定义为 Activity 上的静态方法。默认命名为 `AppActivity。
      • 确保您已获得proj.android/AndroidManifest.xml、&lt;uses-permission android:name="android.permission.VIBRATE"/&gt; 的振动权限

      因此,在 Classes/ 文件夹中的标准 C++ 标头之一中,添加

      //Classes/any_header.h
      void vibrate(int milliseconds);
      

      并在关联的.cpp 文件中,调用它:

      //Classes/any_header.cpp
      void get_hit()
      {
        vibrate(200);
      }
      

      在您的proj.android/AndroidManifest.xml 中,您需要添加该行

      <manifest>
        ...
        <uses-permission android:name="android.permission.VIBRATE"/>
      </manifest>
      

      在jni 将处理的cpp 文件中,例如proj.android/jni/hellocpp/main.cpp,您需要通过调用Java 方法来定义Java 和C++ 之间的连接:

      //proj.android/jni/hellocpp/main.cpp
      /* this function should already exist though */
      void cocos_android_app_init (JNIEnv* env, jobject thiz) {
          LOGD("cocos_android_app_init");
          AppDelegate *pAppDelegate = new AppDelegate();
      }
      
      /* this is the new one you're adding, where org/cocos2dx/cpp/AppActivity
         is the java file where your Activity with the vibrate static method is defined 
      */
      void vibrate(int milliseconds)
      {
          JniMethodInfo minfo;
          CCAssert(JniHelper::getStaticMethodInfo(minfo, "org/cocos2dx/cpp/AppActivity", "vibrate", "(I)V"), "Function doesn't exist");
          minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, (jint)milliseconds);
          minfo.env->DeleteLocalRef(minfo.classID);
      }
      

      最后,这里是.java 文件,android 调用振动的地方。我的是proj.android/src/org/cocos2dx/cpp/AppActivity.java

      /* default imports */
      package org.cocos2dx.cpp;
      
      import org.cocos2dx.lib.Cocos2dxActivity;
      
      /* imports needed for vibration stuff */
      import android.os.Vibrator;
      import android.content.Context;
      import android.app.ActivityManager;
      import android.util.Log;
      import android.os.Bundle;
      
      public class AppActivity extends Cocos2dxActivity {
      
          private static volatile Cocos2dxActivity mainActivity;    
          public static void setMainActivity(Cocos2dxActivity activity)
          {
              mainActivity = activity;
          }
      
          public static Cocos2dxActivity getMainActivity()
          {
              if(mainActivity == null)
              {
                  Log.w("MY_APP_NAME_GOES_HERE", "Warning : null main Activity");
              }
              return mainActivity;
          }
      
          @Override
          protected void onCreate(Bundle savedInstanceState)
          {
              super.onCreate(savedInstanceState);
              AppActivity.setMainActivity(this);
          }
      
          public static void vibrate(int milliseconds)
          {
              Vibrator v = (Vibrator) getMainActivity().getSystemService(Context.VIBRATOR_SERVICE);
              if (getMainActivity().getSystemService(Context.VIBRATOR_SERVICE) != null) 
              {
                  v.vibrate(milliseconds);
              } 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-11
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多