[英]How to add vibration to cocos2d-x 3.2 on Android and iOS devices?
經過大量搜索之后,終於在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.