这个震动需要调用adnroid系统的方法,所以需要C++调用java,JNI这里就不多做介绍了,需要的可以自己去查找下相关资料,如果你只是需要实现这个功能,相信你看完本文,应该就OK了!

1.首先,修改你的android项目的AndroidManifest.xml文件,给app增加震动权限

<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.cocos2dx.application"
android:versionCode=""
android:versionName="1.0">
<uses-sdk android:minSdkVersion=""android:targetSdkVersion=""/>
<!--....-->
<!--add line-->
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>

2.修改android项目源文件src/org/cocos2dx/lib/Cocos2dxSound.java增加震动方法,调用android底层振动器

/**
* @param time 震动时间
*/
public void vibrate(long time){
Vibratorv=(Vibrator)mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(time);
} /**
* @param pattern 震动时间数组 EG:{500,200,500,300}
* @param repeat 重复次数
*/
public void vibrateWithPattern(long pattern[], int repeat){
Vibratorv=(Vibrator)mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(pattern, repeat);
}
/**
* 取消震动
*/
public void cancelVibrate(){
Vibratorv=(Vibrator)mContext.getSystemService(Context.VIBRATOR_SERVICE);
v.cancel();
}

3.至此,java项目中的修改就OK啦,下面就是在Cocos2d-x中增加JNI方法让C++去掉用Java的震动方法就OK啦!

3.1.修改 libCocosDenshion项目中CocosDenshionandroidjni文件夹下的SimpleAudioEngineJni.h和SimpleAudioEngineJni.cpp方法

#ifndef __SIMPLE_AUDIO_ENGINE_JNI__
#define __SIMPLE_AUDIO_ENGINE_JNI__
#include
extern"C"
{
......
// add these menthod
externvoidvibrateJNI(longlongtime);
externvoidvibrateWithPatternJNI(longlongpattern[],intrepeat);
externvoidcancelVibrateJNI();
}
#endif // __SIMPLE_AUDIO_ENGINE_JNI__
// add these jni menthod
void vibrateJNI(long longtime)
{
JniMethodInfo methodInfo;
if(!getStaticMethodInfo(methodInfo,"vibrate","(J)V"))
{
return;
}
methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,time);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
} void vibrateWithPatternJNI(long longpattern[], int repeat)
{
JniMethodInfo methodInfo;
if(!getStaticMethodInfo(methodInfo,"vibrateWithPattern","([JI)V"))
{
return;
}
int elements=sizeof(pattern);
jlongArray jLongArray=methodInfo.env->NewLongArray(elements);
methodInfo.env->SetLongArrayRegion(jLongArray,,elements,(jlong*)pattern);
methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID,jLongArray,repeat);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
void cancelVibrateJNI()
{
JniMethodInfo methodInfo;
if(!getStaticMethodInfo(methodInfo,"cancelVibrate","()V"))
{
return;
}
methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}

3.2修改CocosDenshion/include/SimpleAudioEngine.h增加如下方法.

void vibrate(long longtime);
void vibrateWithPattern(long longpattern[],int repeat);
void cancelVibrate();

3.3修改CocosDenshion/android/SimpleAudioEngine.cpp增加调用JNI的如下方法。

void SimpleAudioEngine::vibrate(long longtime)
{
vibrateJNI(time);
}
void SimpleAudioEngine::vibrateWithPattern(long longpattern[],intrepeat)
{
vibrateWithPatternJNI(pattern, repeat);
}
void SimpleAudioEngine::cancelVibrate()
{
cancelVibrateJNI();
}

4.至此,代码上的修改都OK啦,在游戏中需要使用震动的地方调用。

CocosDenshion::SimpleAudioEngine::sharedEngine()->vibrate(time);
CocosDenshion::SimpleAudioEngine::sharedEngine()->vibrateWithPattern(pattern, repeat);

Cancle Vibrate Using this!

CocosDenshion::SimpleAudioEngine::sharedEngine()->cancelVibrate();

5.如果需要修改后的代码,请移步原帖。

Cocos2d-x添加Android手机震动的更多相关文章

  1. cocos2d-x3.2中加入Android手机震动

    本人宣布从此博文发出后,我的cocos2dx的引擎从cocos2dx3.1.1跳到cocos2dx3.2,哈哈,事实上变化不大的,不碍事~~~ 以下来说说在cocos中加入Android手机震动的功能 ...

  2. android手机震动

    Vibrator是安卓提供的震动器,其没有构造器,通过getSystemService(Context.VIBRATOR_SERVICE)方法获取对象.但使用此类时需要在清单文件中添加访问权限andr ...

  3. Android 手机震动

    1.添加震动权限 <uses-permission android:name="android.permission.VIBRATE"/> 2.获取震动服务 Vibra ...

  4. Android 手机震动功能实现

    1首先在AndroidManifest.xml中添加震动权限 <uses-permission android:name="android.permission.VIBRATE&quo ...

  5. Android 手机震动 设置震动时间

    开启震动,单次,5秒: Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); //震动5秒 vibrator.vibra ...

  6. [android] 手机卫士输入框抖动和手机震动

    查看apiDemos,找到View/Animation/shake找到对应的动画代码,直接拷贝过来 当导入一个项目的时候,报R文件不存在,很多情况是xml文件出错了 Animation shake = ...

  7. 【Android】Android如何实现手机震动

    实现手机震动其实很简单,手机震动使用是Vibrator类,然后震动也是需要权限的,在使用之前在AndroidManifest.xml文件中添加 <uses-permission android: ...

  8. Vibrator控制手机震动

    Vibrator控制手机震动 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9049755 添加权限 & ...

  9. 如何在Android手机上进行自动化测试(上)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本节教程,你将了解到以下内容: 如何在脚本代码中.运行脚本时指定手机 如何填写--device Android:/// ...

随机推荐

  1. 测试storm异常信息(时时更新)

    Exception in thread "main" java.lang.RuntimeException: org.apache.thrift7.protocol.TProtoc ...

  2. java面试第六天

    集合:保存多个其他对象的对象,不能保存简单类型 List:有序(存放元素的顺序),可重复的集合 ArrayList:实质就是一个会自动增长的数组 查询效率比较高,增删的效率比较低,适用于查询比较频繁, ...

  3. 笔试题之xml

    XML部分 1.xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM ...

  4. chrome插件的popup与跨域请求

    chrome插件的popup与跨域请求 tkorays <tkorays@hotmail.com> popup及其它js脚本         在chrome插件开发中,大致有几种类型的js ...

  5. Java中的软(弱)引用

    一.Java中的强.软.弱.虚引用 在JDK中我们能够看到有一个java.lang.ref的包.这个包中就是Java中实现强.软.弱.虚引用的包,例如以下: PhantomReference 虚引用: ...

  6. Oracle快速克隆安装

    Oracle的家目录进行快速克隆,对同类型机器配置很高效的! 01.确认你在克隆数据库时,原数据库已经关闭 sqlplus   /   as sysdba; shutdown immediate ; ...

  7. result-charts

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. static不实现多态

    class Father { public static String getName() { return "father"; } } class Children extend ...

  9. HDUOJ----4504 威威猫系列故事——篮球梦

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  10. 【LeetCode】164. Maximum Gap (2 solutions)

    Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ...