近日正好要在手游中添加手机震动功能。没搞过啊,上网找了下,结果相关文章还是不少的,讲得也挺详细的,但我找到的都要去改cocos2dx的底层代码。我看了下,完全没必要啊。在自己的Java文件中定义一个静态方法就行了。


Java需添加内容:


随便找个自己的Java类(游戏主入口类也行),在类中定义如下静态方法:

public static void vibrate(int vibrateTime) {

    Vibrator vib = 

(Vibrator)MainClass.returnContent().getSystemService(Service.VIBRATOR_SERVICE);

vib.vibrate(vibrateTime);

}

MainClass:是你游戏的主入口Java文件名

需要在主入口Java类中定义和添加如下内容:

private static Activity mActivity;


MainClass.mActivity = this;


public static Activity returnContent() 

        {

return mActivity;

         }



C++需添加的内容:


找个C++类,添加这个方法

//参数是毫秒数

VibratorJNI(int vibratorTime)  

    {  

        JniMethodInfo t;  

        const char * jniClass = "用vibrate方法所在Java类名填冲这个字符串";

        if (JniHelper::getStaticMethodInfo(t, jniClass, "vibrate", "(I)V"))  

        {  

            t.env->CallStaticVoidMethod(t.classID, t.methodID, vibratorTime);  

            t.env->DeleteLocalRef(t.classID);  

        }  

    }


调用方法:


1.在C++中调用

C++ClassName::VibratorJNI(500);


C++ClassName:是VibratorJNI方法所在的类名;


2.在lua中调用

先把C++方法注入到lua堆栈中

// 震动手机

int LUA_VibratorJNI(lua_State * L)    

{

int time;

time = (int)lua_tonumber(L, 1);

JniUtil::VibratorJNI(time);

return 1;

}


void LUA_SetupAPI(lua_State * L)

{

luaL_Reg lib[] =

{

            {"shakephone", LUA_VibratorJNI},//震动手机

            { NULL, NULL },

};

luaL_register(L, "ctolua", lib);

}

LUA_SetupAPI这个函数要在进入Lua主入口前调用。一般在AppDelegate.cpp中调用



lua代码中直接调用

ctolua.shakephone(500);