环境:Cocos2dxv3.5

经网上搜索资料知道有两种方法可以实现Android返回键的退出功能,下面分别说明。

1、修改java代码

首先,在Cocos2dx的源文件中找到Cocos2dxGLSurfaceView.java文件,它的路径是:cocos2d\cocos\platform\android\java\src\org\cocos2dx\lib\Cocos2dxGLSurfaceView.java。注意要在自己的工程文件里面找这个文件。

打开Cocos2dxGLSurfaceView.java,找到其中的onKeyDown函数:

    @Override    public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {        switch (pKeyCode) {            case KeyEvent.KEYCODE_BACK:                Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);            case KeyEvent.KEYCODE_MENU:            case KeyEvent.KEYCODE_DPAD_LEFT:            case KeyEvent.KEYCODE_DPAD_RIGHT:            case KeyEvent.KEYCODE_DPAD_UP:            case KeyEvent.KEYCODE_DPAD_DOWN:            case KeyEvent.KEYCODE_ENTER:            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:            case KeyEvent.KEYCODE_DPAD_CENTER:                this.queueEvent(new Runnable() {                    @Override                    public void run() {                        Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);                    }                });                return true;            default:                return super.onKeyDown(pKeyCode, pKeyEvent);        }}

修改为如下代码(在caseKeyEvent.KEYCODE_BACK分支中添加返回false的语句,表示不处理按键消息):

    @Override    public boolean onKeyDown(final int pKeyCode, final KeyEvent pKeyEvent) {        switch (pKeyCode) {            case KeyEvent.KEYCODE_BACK:                Cocos2dxVideoHelper.mVideoHandler.sendEmptyMessage(Cocos2dxVideoHelper.KeyEventBack);return false;            case KeyEvent.KEYCODE_MENU:            case KeyEvent.KEYCODE_DPAD_LEFT:            case KeyEvent.KEYCODE_DPAD_RIGHT:            case KeyEvent.KEYCODE_DPAD_UP:            case KeyEvent.KEYCODE_DPAD_DOWN:            case KeyEvent.KEYCODE_ENTER:            case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:            case KeyEvent.KEYCODE_DPAD_CENTER:                this.queueEvent(new Runnable() {                    @Override                    public void run() {                        Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);                    }                });                return true;            default:                return super.onKeyDown(pKeyCode, pKeyEvent);        }    }

其次,找到AppActivity.java文件,其路径为:proj.android\src\org\cocos2dx\cpp\AppActivity.java。它的代码如下:

package org.cocos2dx.cpp;import org.cocos2dx.lib.Cocos2dxActivity;public class AppActivity extends Cocos2dxActivity {}

修改为(添加onKeyDown方法,处理返回键按下事件):

package org.cocos2dx.cpp;import org.cocos2dx.lib.Cocos2dxActivity;import org.cocos2dx.lib.Cocos2dxGLSurfaceView;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.widget.Toast;public class AppActivity extends Cocos2dxActivity {private long mKeyTime = 0;public boolean onKeyDown(int keyCode, KeyEvent event) {if (KeyEvent.KEYCODE_BACK == keyCode && KeyEvent.ACTION_DOWN == keyCode) {if ((System.currentTimeMillis() - mKeyTime) > 2000) {mKeyTime = System.currentTimeMillis();Toast.makeText(getApplicationContext(), "要离开游戏吗?", Toast.LENGTH_SHORT).show();} else {finish();System.exit(0);}return true;}return super.onKeyDown(keyCode, event);}}

最终,重新编译生成apk文件,按下Android手机的返回键,就能实现退出游戏了。但是经测试,游戏会直接退出,而不会出现提示,以后再探索。

2、在Cocos2dx中添加代码

第一步,在Cocos2dx的场景类中添加虚方法:

virtual void onKeyReleased(cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event);

第二步,实现该虚方法:

void HelloWorld::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event){switch (keyCode){case EventKeyboard::KeyCode::KEY_BACK://返回键//退出游戏#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");return;#endifDirector::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)exit(0);#endifbreak;default:break;}}

第三步,在场景类的init方法中添加按键事件监听:

//Android按键监听auto keyboardListener = EventListenerKeyboard::create();keyboardListener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this);this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(keyboardListener, this);

最后,重新编译,同样能够实现退出的效果。

结论:java代码对Android系统有直接的操作,因此它比Cocos2dx的退出更直接,两种方法再次启动游戏的时候会从头加载资源。另外,官方demo中指出,第2种方法“Only avaliable on Desktop and Android”,即仅仅对WIndows平台和Android平台有效,并且需要在onKeyReleased事件中处理消息才能正确响应。









更多相关文章

  1. SpannableString的使用方法
  2. Android中Activity状态的保存和恢复:onSaveInstanceState和onRest
  3. Android开发AsyncTask异步处理任务
  4. Android文本输入框EditText属性和方法说明
  5. Android中WebView使用html,且实现android和JS的互相调用
  6. Android中如何将dp,dip,sp与px相互转化
  7. android 退出activity 转吖转
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android中Intent的显示和隐式使用
  2. Android之WebView优化之路
  3. Android自定义控件一简介
  4. 《第一行代码》学习笔记一
  5. android软键盘的用法总结
  6. Android(安卓)wifi驱动的移植 realtek 81
  7. 每天学习一个Android中的常用框架——12.
  8. Android应用程序框架层和系统运行库层日
  9. Android界面布局的几种常用方式
  10. Android中级进阶FAQ