这个震动需要调用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. PACS系统简易

    PACS系统 http://baike.baidu.com/link?url=prHBMbyu5W98ET1UGQ0PXXxLebxAeljckFH0pfO_2aODe1UgsrWgRd4Unbopt ...

  2. 算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)

    目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车 ...

  3. MySQL_Oracle_事物的隔离级别

    数据库会话的设置: 1:脏读 情景:A事物读取B事物修改了但是未提交的数据 问题:若B回滚了事物,A就读到了错误数据. 2:不可重复读 情景:A事物查询数据,B修改了数据,A又查询数据 问题:A事物前 ...

  4. angular.foEach

    1.针对对象循环(key,value) 官方示例: var values = {name: 'misko', gender: 'male'}; var log = []; angular.forEac ...

  5. OpenERP7.0安装后提示“not supported" ,如何去掉此提示

    转自:http://blog.csdn.net/vnsoft/article/details/17581831 下载了新版本的OpenERP7.0安装测试,发现在登录后会提示如图的内容. 经过测试发现 ...

  6. jsp页面获取集合的长度

      createTime--2016年10月12日16:20:02Author:Marydonjsp页面获取集合的长度 在jsp页面与js中不能通过${list.size}取列表长度,而是引入jstl ...

  7. 26、线性表(List)

    1.List List接口是Collection的子接口,List是一个可重复集合 2.ArrayList和LinkedList ArrayList和LinkedList是List接口最常见的两个实现 ...

  8. Centos7安装Openresty

    通过yum安装 在 /etc/yum.repos.d/ 下新建 OpenResty.repo 内容 [openresty] name=Official OpenResty Repository bas ...

  9. Apache Hadoop 3.0新版本介绍及未来发展方向

    过去十年,Apache Hadoop从无到有,从理论概念演变到如今支撑起若干全球最大的生产集群.接下来的十年,Hadoop将继续壮大,并发展支撑新一轮的更大规模.高效和稳定的集群. 我们此次将向大家全 ...

  10. Linux命令行上执行操作,不退回命令行的解决方法

    问题描述: 如果你现在登录Centos执行了某个操作,但是操作一直占用命令行,命令行显示的也都是这个命令相关的操作,我想做其它事情 ,该怎么办呢 ? 解决方法: 根据<Linux命令行与Shel ...