1

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

我在官方论坛上关注了一些关于此的参考链接,但我仍然很难过。

谁能帮我?

4

3 回答 3

1

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

有一个振动器类。

振动器.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

振动器.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。

于 2015-02-24T05:33:41.323 回答
0

FenneX 的 github上应该有一个在 iOS 和 Android 上运行的振动实现。

头文件位于 Classes/FenneX/NativeWrappers/NativeUtility.h中。

iOS 实现在 proj.ios_mac/ios/Misc/NativeUtility.mm

Android 实现在 proj.android/jni/NativeUtility.cpp中有 C++

src 中某处的 Java 。

来自一个论坛帖子问同样的事情

于 2015-02-23T00:40:12.137 回答
0

根据论坛帖子中的代码:

  • 您需要在您的Classes/文件夹中添加一个标题,您只需要声明但未定义 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++ 标头之一中,添加

//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);
}

最后,这是.javaandroid 调用 vibrate 的文件。我的是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);
        } 
    }
}
于 2015-02-23T02:07:06.490 回答