原文地址:http://50vip.com/390.html

一般的游戏或者软件,都会在android版本上做退出程序的功能,一般的实现方式有两种:

1.点击返回按键,弹出确认是否退出;

2.点击返回,toast提示再次点击退出程序。

这两种方式实现都需要android上监听用户按下了android手机上的返回键,监听到了之后执行相应的操作。

通过搜索,很容易知道可以实现activity类的方法

public boolean onKeyDown(final int pKeyCode,final KeyEvent pKeyEvent)

实现对用户按键的监听,但是将代码加入到cocos2d-x生成的Java代码中的AppActivity中,发现根本不起作用,没法监听到用户的按键操作,找官方api文档,发现:

public booleanonKeyDown(int keyCode,KeyEventevent)

Since:API Level 1

Called when a key was pressed down and not handled by any of the views inside of the activity.So,for example,key presses while the cursor is inside a TextView will not trigger the event (unless it is a navigation to another object) because TextView handles its own key presses.

If the focused view didn't want this event,this method is called.

这段文字我需要强调的是红色标记部分,翻译的意思是:当用户按下一个按键的时候调用,但是前提是这个事件没有被其他的任何views监听并处理。

因此不难得知,在cocos2d-x游戏中,在实现的onKeyDown方法监听不到返回键,是因为这个返回键事件已经被其他的onKeyDown处理掉了,具体是谁呢?看cocos2d-x的android版本代码(framework/scocos2d-x/cocos/2d/platform/android/java/src/org/cocos2dx/lib/Cocos2dx/GLSurfaceView.java)。其中实现了onKeyDown方法:

@Override
public boolean onKeyDown(final int pKeyCode,final KeyEvent pKeyEvent) {
    switch (pKeyCode) {
        case KeyEvent.KEYCODE_BACK:
             
        case KeyEvent.KEYCODE_MENU:
            this.queueEvent(new Runnable() {
             @Override
            public void run() {
                Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
            }
        });
        return true;
        default:
            return super.onKeyDown(pKeyCode,pKeyEvent);
    }
}

这个里面,按键KeyEvent.KEYCODE_BACK被监听了,只要在这里不作处理即可(return false),改成如下代码:

@Override
public boolean onKeyDown(final int pKeyCode,final KeyEvent pKeyEvent) {
    switch (pKeyCode) {
        case KeyEvent.KEYCODE_BACK:
            return false;
        case KeyEvent.KEYCODE_MENU:
            this.queueEvent(new Runnable() {
             @Override
            public void run() {
                Cocos2dxGLSurfaceView.this.mCocos2dxRenderer.handleKeyDown(pKeyCode);
            }
        });
        return true;
        default:
            return super.onKeyDown(pKeyCode,pKeyEvent);
    }
}
这样在你自己的cocos2d-x游戏Activity中就可以监听返回键了,在AppActivity中重写onKeyDown方法,如下:
private long mkeyTime = 0;
public boolean onKeyDown(int keyCode,KeyEvent event) {
    //二次返回退出
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        if ((System.currentTimeMillis() - mkeyTime) > 2000) {
            mkeyTime = System.currentTimeMillis();
            Toast.makeText(this,"再按一次退出游戏",Toast.LENGTH_LONG).show();
        } else {
            finish();
            System.exit(0);
        }
        return false;
    }
    return super.onKeyDown(keyCode,event);
}
然后运行游戏, 点击返回键试试,有没有Toast?

Cocos2d-x android使用onKeyDown监听返回键实现二次返回退出的更多相关文章

  1. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  2. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  3. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

  4. android – 如何在特定号码的应用程序中共享文本

    使用此代码只打开特殊号码的聊天但文本不是共享.我该怎么做?解决方法由于您尝试将其实现为“smsto:”,因此“text/plain”类型将帮助您.如果没有帮助,请尝试额外的“sms_body”.

  5. android – JobIntentService被破坏,当app被销毁时

    从Android开发人员JobIntentService开始在AndroidO或更高版本上运行时,工作将通过JobScheduler.enqueue作为作业分派.在较旧版本的平台上运行时,它将使用Context.startService.在我的情况下,我正在学习JobIntentService,在我的情况下,我有一个计时器,每秒运行一次并显示当前的日期和时间,但当我的应用程序被销毁时,JobInt

  6. android – Toast与Dialog框:何时使用?

    谢谢.解决方法Toast主要用于告知用户一些不重要且不需要交互的东西,所以我会使用Toastforthethat.此外,Toast不会阻止用户使用设备/应用程序,您仍然可以激活,例如显示Toast时的基础图标.对话框通常要求用户做出选择,或者显示不需要交互的进度但是将使用户在此期间不做其他事情,这可能是重要的,例如,一旦用户在完成参数之前更改参数,您进行的计算将失败.

  7. 在Android中收听ENTER键

    不是那样的.您需要覆盖dispatchKeyEvent.一个例子:

  8. android – ProgressDialog.dismiss()不起作用

    请检查以下示例代码.显示Toast消息但从不隐藏progressdialog.为什么?五秒后显示“DONE”消息,但progressdialog没有被解雇,即使我把pd.dismiss()放在thr下面pd.show()我也不会忽略progressdialog,我不知道为什么会这样.这让我发疯了!)行旁边显示一个简洁的小警告标志.你在做什么>使用新的ProgressDialog()创建进度对话框>使用pd.Show()创建带有所需文本的另一个进度对话框,而不存储对它的引用.>关闭第一个对话框.的对话框仍然

  9. android – 将侦听器添加到数字选择器小部件

    我正在努力将数字选择器集成到我的应用程序中.活动显示每个带有数字选择器的项目列表.用户可以使用数字选择器增加或减少数量.当他们这样做时,我想更新显示价格的TextView.我试图实现这一目标时遇到了困难.我做了一个简单的项目,并试图在用户点击小部件时尝试显示一个Toast消息,但无济于事.我的猜测是,数字窗口小部件不被视为按钮,因此点击监听器不起作用?

  10. Android中的EACCESS权限被拒绝

    在外部SD卡中写入文件时,我收到错误EACCESS权限被拒绝.我已经设置了权限但是当我读取文件时,我成功地能够读取它但无法写入文件.我用于在SD卡中写入文件的代码是:外部存储卡的路径是mnt/extsd/.这就是为什么我无法使用Environment.

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部