簡體   English   中英

如何在Android和iOS設備上為cocos2d-x 3.2添加振動?

[英]How to add vibration to cocos2d-x 3.2 on Android and iOS devices?

我想使用cocos2d-x 3.2通過一種滑塊功能來振動設備。

我在官方論壇上關注了一些與此有關的參考鏈接,但仍然感到困惑。

誰能幫我?

經過大量搜索之后,終於在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(); 

在Tab中無法使用,因為其中沒有振動器。

應該在FenneX的github上的iOS和Android上有一個有效的vibrate實現。

頭文件位於Classs / FenneX / NativeWrappers / NativeUtility.h中

iOS實現位於proj.ios_mac / ios / Misc / NativeUtility.mm中

Android實現在proj.android/jni/NativeUtility.cpp中具有C ++

Java 在src中的某個地方

來自論壇帖子,問同樣的事情

根據論壇帖子中找到的代碼:

  • 您需要在Classes/文件夾中添加一個標頭,在該標頭中僅聲明了cpp函數,但未定義。
  • 您需要在.cpp文件的proj.android/jni添加函數定義。 我使用了proj.android/jni/hellocpp/main.cpp ,我相信這是啟動器cocos2dxv3項目的默認設置。 在此方法中,將調用您在Java中定義的方法,在這種情況下,它被定義為Activity上的靜態方法。 默認名稱為`AppActivity。
  • 確保您已對proj.android/AndroidManifest.xml獲得振動許可, <uses-permission android:name="android.permission.VIBRATE"/>

因此,在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);
        } 
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM