最近在做cocos2dx3.2项目给wp8平台上的移植,由于是第一次做,其中遇到了一些不少问题,而项目中对于物理返回键的响应就是一个我解决了较久的问题,之前在网上查资料,这方面的比较少,今天把这个写出来希望可以帮到大家,特别是新手,大牛还望指正呐!
首先很多2dx游戏各个场景之间切换都会有返回按钮,而在android中我们只需要重写按键的响应事件onKeyReleased方法,然后对其做逻辑处理即可,例如如下即可实现对于物理返回按键的响应,可是在wp8下可没有这么简单。
void MenuLayer::onKeyReleased(EventKeyboard::KeyCode keyCode, Event *pEvent)
{
Scene *pLastScene = LastScene::Create();
Director::getInstance()->replaceScene(pLastScene);
}
将2dx项目运行在wp8上实现了C++语言与C#的互用,那么WP8项目就有实现这些的底层引擎接口,那么到底是那些底层代码需要我们处理呐。
可能大家经过研究之后都会首先看到项目GameTest目录下的MainPage.xaml.cs文件,这是项目对于WP8平台的处理事件函数。起初,我在这个文件中找到了OnBackKeyPress方法,以为这就是处理返回键事件的,然后按照它的继承关系找到GameTestComponent 下src中的 Direct3DInterop.cpp , 在这个其中进行逻辑事件响应判断,其实不然,如果在这个方法中进行了处理,之后物理返回键可以响应,但是底层的渲染出了问题。包括返回之后改Scene中加载的plist资源文件会显示不出来。那么我们在看了该函数方法后是不是改顺藤摸瓜往更底层找呐?是的应该找到GLView.cpp函数,对它内部进行修改。
那这个GLView.cpp在哪儿呐?也许你又要苦恼半天了,好了看在世界如此美好的份上,我就告诉你们,哈哈。这个文件在解决方案的引用库libcocos2d中,完整的地址是libcocos2d->platform->wp8,如下图所示
进入之后找到GlView::onBackKeyPressed()方法,对它就行修改,这儿要强调的是,我们一般都要对首页进行特殊处理,在首页你再点击返回键,则按一般逻辑就是提示是否退出游戏没那么就在这人要进行处理了,如下图我这块的处理举例。
首先第一个if是判断当前scene是否为菜单首页,如果是,那么第二个if判断该scene有无首页中其他弹出的信息提示框,如果有或者不是首页,那么就将逻辑交给2d中的对应的Event事件处理,如果是首页并且无其他信息提示框,那么就要判断是不是退出游戏,则要交给m_delegate句柄进行处理。需要特别说明的是,这个退出处理是放在上面提到过的MainPage.xml.cs中的OnCocos2dEvent方法中,如下图,只对Cocos2dEvent::TerminateApp(退出程序)事件处理。
至于其他返回事件则交由C++程序自己逻辑处理,分别在对应的每个Layer当中继承onKeyReleased事件即可,如下图所示:
好了,到这里,基本可能涉及的wp8的返回事件都完成了,接下来去试试吧!