虽然在cocos2d-x支持的平台中包括Windows、Mac、Linux这样的传统电脑平台,但是这些平台只是被视为开发环境而存在的,对于在这些平台上面发布游戏,cocos2d-x本身没有提供官方的解决方案。然而,这些平台(尤其是Windows)拥有的用户数量不可忽视,既然cocos2d-x已经兼容了这些平台,那么我们在其基础上进行一些拓展,使得用cocos2d-x制作的游戏能够在这些平台上面发布,何乐而不为呢。
输入
手机游戏与电脑游戏最大的区别是输入方式的不同,手机主要靠触摸屏输入,而电脑主要使用鼠标、键盘,cocos2d-x本身可以通过触摸屏的方式来接收鼠标输入,所以我们要做的就是让cocos2d-x能够接收键盘输入。
AccelerometerKeyHook
通过跟进查看cocos2d-x的源代码,我们不难发现触摸屏的消息处理函数(ccTouchesBegan之类的)是由CCTouchDispatcher调用的,而CCTouchDispatcher的消息处理函数又是由CCEGLView调用的,在CCEGLView里面我们找到了WindowProc( UINT , WPARAM , LPARAM )这个函数,玩过Windows编程的同学都兴奋起来了吧。没错,这货就是用来接收各种窗口消息的,通过在这个函数里面处理WM_KEYDOWN、WM_KEYUP、WM_CHAR等消息,我们就可以达到响应键盘输入的目的。
但是慢着,直接在WindowProc函数里面处理键盘消息会破坏引擎的源代码,而且不方便代码重用。查看WindowProc函数,发现WM_KEYDOWN、WM_KEYUP、WM_CHAR等消息都会调用一个叫做m_lpfnAccelerometerKeyHook的钩子函数:
if(m_lpfnAccelerometerKeyHook!=NULL)
{
(*m_lpfnAccelerometer)(message,wParam,lParam);
}
再看看这个函数指针的类型:
typdef void (*LPFN_ACCELEROMETER_KEYHOOK)(UINT message,WPARAM wParam,LPARAM lParam);
OK,这个就是我们要找的东西了。我们只要写一个自己的消息处理函数,然后赋值给这个函数指针就行了:
//声明函数
void wndKeyProc(UINT message,WPARAM wParam,LPARAM kParam)
{
//TODO
}
//设置函数
CCDirector::sharedDirector()->getOpenGLView()->setAccelerometerKeyHook(&wndKeyProc);
相关代码参考这里
资源打包 处理完了键盘输入的问题,cocos2d-x已经可以用来开发Windows游戏了。不过,开发好的游戏在发布之前一般都会对游戏资源进行打包,你可以在这里找到一些用于打包的工具和代码。
其它 当然,一款商业级别的大作可能还会要求手柄输入、全屏模式、鼠标右键等等,这些枝枝叶叶就留待以后再讨论吧~