cocos2dx震动实现

根据网上总结,自己亲自实现了的,90%靠谱率

一:c++端

1,修改CocosDenshion\android\jni目录下的两个文件SimpleAudioEngineJni.cpp,SimpleAudioEngineJni.h

SimpleAudioEngineJni.h

增加内容

<span style="white-space:pre">	</span>extern void vibrateJNI(long long time);
	extern void vibrateWithPatternJNI(long long pattern[], int repeat);
	extern void cancelVibrateJNI();
SimpleAudioEngineJni.cpp

增加内容(实现)

<span style="white-space:pre">	</span>void vibrateJNI(long long time)

	{
		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 long pattern[], 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, 0, 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);

	}
2,在\CocosDenshion\include下SimpleAudioEngine.h增加如下内容(就是声明,你懂的)

<span style="white-space:pre">	</span>void vibrate(long long time);

	void vibrateWithPattern(long long pattern[], int repeat);

	void cancelVibrate();
3    到这里其实有效的部分已经完成了,但是还要增加win32相应地方,因为我们的代码毕竟是在windows平台上编译,所以调用还是会调用CocosDenshion\win32下的方法,所以还要在目录CocosDenshion\win32下增加如下代码

void SimpleAudioEngine::vibrate(long long time)

{

}

void SimpleAudioEngine::vibrateWithPattern(long long pattern[], int repeat)

{


}

void SimpleAudioEngine::cancelVibrate()

{


}

空函数就可以了,不需要实现,这里只是为了之后可以编译链接(其实是链接)的时候可以通过,找到函数而已。    当然也可以不写这些东西,那么在调用震动方法的代码地方加上平台判断也可以#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)  也可以。

二、 android端

AndroidManifest.xml中加震动权限

<uses-permission android:name="android.permission.VIBRATE" />


编辑org.cocos2dx.lib下的Cocos2dxSound.java文件,增加如下内容

/*** @param time 震动时间*/

	public void vibrate(long time) {
		Vibrator v = (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) {
		Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
		v.vibrate(pattern,repeat);
	}

	/*** 取消震动 */

	public void cancelVibrate() {
		Vibrator v = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
		v.cancel();
	}
在文件Cocos2dxHelper.java中增加如下内容

//vibrate 相关
	public static void vibrate(long time){
		Cocos2dxSound cocos2dxsound = new Cocos2dxSound(sContext);
		cocos2dxsound.vibrate(time);
	}
	
	public static void vibrateWithPattern(long[] pattern, int repeat){
		Cocos2dxSound cocos2dxsound = new Cocos2dxSound(sContext);
		cocos2dxsound.vibrateWithPattern(pattern,repeat);
	}
	

	public static void cancelVibrate() {
		Cocos2dxSound cocos2dxsound = new Cocos2dxSound(sContext);
		cocos2dxsound.cancelVibrate();
	}
	
OK了,准备代码完成了

调用,就用下面的了

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


完成!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值