如何在 Android 和 iOS 设备上为 cocos2d-x 3.2 添加振动?
How to add vibration to cocos2d-x 3.2 on Android and iOS devices?
我想使用 cocos2d-x 3.2.
在我的滑块功能之一中振动我的设备
我在官方 forums 上关注了一些关于此的参考链接,但我仍然感到困惑。
谁能帮帮我?
在 iOS 和 Android 上 FenneX's github 应该有振动的工作实现。
The header file is in
Classes/FenneX/NativeWrappers/NativeUtility.h.
iOS implementation is in proj.ios_mac/ios/Misc/NativeUtility.mm
Android implemention have the C++ in
proj.android/jni/NativeUtility.cpp
the Java somewhere in the src.
来自 forum post 问同样的事情
基于 forum post 中找到的代码:
- 您需要在您的
Classes/
文件夹中添加一个 header,您只在其中声明了 cpp 函数但未定义。
- 您需要在
proj.android/jni
文件中添加一个函数定义,在 .cpp
文件中。我使用了 proj.android/jni/hellocpp/main.cpp
,我认为这是 cocos2dxv3 入门项目的默认值。在此方法中,您调用在 java 中定义的方法,在本例中,它被定义为 Activity 中的静态方法。默认命名为`AppActivity.
- 确保您已获得
proj.android/AndroidManifest.xml
、<uses-permission android:name="android.permission.VIBRATE"/>
的振动许可
因此,在 Classes/
文件夹中的一个标准 C++ header 中,添加
//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>
在 cpp 文件中,jni
将处理,比如 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);
}
}
}
经过大量搜索,我终于在 Cocos2d-x 3.2 中为 android 完成了我的振动功能。
有一个振动器Class。
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;
然后,添加这2个方法
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 ();
}
现在,每当我们想要使用振动功能时,我们只需包含此振动器 Class 并按如下方式简单地调用它即可。
Vibrator::Vibrate(50);
要禁用它,
Vibrator::CancelVibrate();
in 在 Tab 中不起作用,因为它没有振动器。
我想使用 cocos2d-x 3.2.
在我的滑块功能之一中振动我的设备我在官方 forums 上关注了一些关于此的参考链接,但我仍然感到困惑。
谁能帮帮我?
在 iOS 和 Android 上 FenneX's github 应该有振动的工作实现。
The header file is in Classes/FenneX/NativeWrappers/NativeUtility.h.
iOS implementation is in proj.ios_mac/ios/Misc/NativeUtility.mm
Android implemention have the C++ in proj.android/jni/NativeUtility.cpp
the Java somewhere in the src.
来自 forum post 问同样的事情
基于 forum post 中找到的代码:
- 您需要在您的
Classes/
文件夹中添加一个 header,您只在其中声明了 cpp 函数但未定义。 - 您需要在
proj.android/jni
文件中添加一个函数定义,在.cpp
文件中。我使用了proj.android/jni/hellocpp/main.cpp
,我认为这是 cocos2dxv3 入门项目的默认值。在此方法中,您调用在 java 中定义的方法,在本例中,它被定义为 Activity 中的静态方法。默认命名为`AppActivity. - 确保您已获得
proj.android/AndroidManifest.xml
、<uses-permission android:name="android.permission.VIBRATE"/>
的振动许可
因此,在 Classes/
文件夹中的一个标准 C++ header 中,添加
//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>
在 cpp 文件中,jni
将处理,比如 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);
}
}
}
经过大量搜索,我终于在 Cocos2d-x 3.2 中为 android 完成了我的振动功能。
有一个振动器Class。
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;
然后,添加这2个方法
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 ();
}
现在,每当我们想要使用振动功能时,我们只需包含此振动器 Class 并按如下方式简单地调用它即可。
Vibrator::Vibrate(50);
要禁用它,
Vibrator::CancelVibrate();
in 在 Tab 中不起作用,因为它没有振动器。