Cocos2D-x引擎支持按键事件,它能检测设备的键盘输入并处理相应的事件。而基于不同操作系统的移动设备,可供用户操作的按键数量和功能都存在差异。

  Cocos2D-x使用CCKeypadDelegate接口类处理相应的事件,这个类定义很简单,如下:
class CC_DLL CCKeypadDelegate
{
public:
    virtual void keyBackClicked() {} //返回按键事件
    virtual void keyMenuClicked() {}; //Menu菜单按键事件(仅android支持该按键)
};
  只有继承并实现该接口才能处理按键事件。布景层类CCLayer和其子类是继承自CCKeypadDelegate,如下:
     自定义类如何支持按键事件呢?很简单。需要继承CCLayer或其子类,在自定义类初始化时,调用方法setKeypadEnabled(true)将自定义类对象添加到按键事件分发类CCKeypadDispatcher中。在添加时使用了CCKeypadHandler类,它用于对CCKeypadDelegate进行封装。接着,就是在自定义类中重写CCKeypadDelegate的两个接口方法。
  当用户按键时,系统将触发相应的按键事件,平台底层会调用CCKeypadDispatcher的相应的按键事件分发方法,将按键事件分发到指定所有按键事件响应对象中,由该对象完成按键事件的响应处理。
   CCKeypadDispatcher的按键事件分发如下:
bool CCKeypadDispatcher::dispatchKeypadMSG(ccKeypadMSGType nMsgType)
{
    CCKeypadHandler*  pHandler = NULL;
    CCKeypadDelegate* pDelegate = NULL;
 
    m_bLocked = true;
 
    if (m_pDelegates->count() > 0)
    {
        CCObject* pObj = NULL;
        CCARRAY_FOREACH(m_pDelegates, pObj)
        {
            CC_BREAK_IF(!pObj);
 
            pHandler = (CCKeypadHandler*)pObj;
            pDelegate = pHandler->getDelegate();
 
            switch (nMsgType)
            {
            case kTypeBackClicked:
                pDelegate->keyBackClicked(); //调用回退按键事件响应方法
                break;
            case kTypeMenuClicked:
                pDelegate->keyMenuClicked(); //调用菜单按键事件响应方法
                break;
            default:
                break;
            }
        }
    }
 
    m_bLocked = false;
    if (m_bToRemove)
    {
        m_bToRemove = false;
        for (unsigned int i = 0; i < m_pHandlersToRemove->num; ++i)
        {
            forceRemoveDelegate((CCKeypadDelegate*)m_pHandlersToRemove->arr[i]);
        }
        ccCArrayRemoveAllValues(m_pHandlersToRemove);
    }
 
    if (m_bToAdd)
    {
        m_bToAdd = false;
        for (unsigned int i = 0; i < m_pHandlersToAdd->num; ++i)
        {
            forceAddDelegate((CCKeypadDelegate*)m_pHandlersToAdd->arr[i]);
        }
        ccCArrayRemoveAllValues(m_pHandlersToAdd);
    }
 
    return true;
}
 
 在TestCpp工程的KeypadTest测试项中有按键事件的代码实例。
   在手游中如果需要进行文字输入,这时就需要用到虚拟键盘。在Cocos2D-x中,通过类CCIMEDelegate来实现虚拟键盘功能。还是看类继承关系图,如下:
 从上图知,CCTextFieldTTF和CCEditBox两个类继承了CCIMEDelegate,这两个类都需要文字输入功能。
看一下CCIMEDelegate的定义。
class CC_DLL CCIMEDelegate
{
public:
    virtual ~CCIMEDelegate();
    virtual bool attachWithIME(); //打开虚拟键盘并允许输入
    virtual bool detachWithIME(); //关闭虚拟键盘并停止输入
 
protected:
    friend class CCIMEDispatcher; 
    virtual bool canAttachWithIME() { return false; } //是否接收输入
    virtual void didAttachWithIME() {} //接收输入时调用
    virtual bool canDetachWithIME() { return false; } //是否结束输入
    virtual void didDetachWithIME() {} //结束输入时调用
    virtual void insertText(const char * text, int len) {CC_UNUSED_PARAM(text);CC_UNUSED_PARAM(len);}//输入文字时调用
    virtual void deleteBackward() {} //按回格(Backspace)键调用
    virtual const char * getContentText() { return 0; } //获取输入文字
    //虚拟键盘准备显示时调用
    virtual void keyboardWillShow(CCIMEKeyboardNotificationInfo& info)   {CC_UNUSED_PARAM(info);}
    //虚拟键盘已显示时调用
    virtual void keyboardDidShow(CCIMEKeyboardNotificationInfo& info)    {CC_UNUSED_PARAM(info);}
    //虚拟键盘准备隐藏时调用
    virtual void keyboardWillHide(CCIMEKeyboardNotificationInfo& info)   {CC_UNUSED_PARAM(info);}
    //虚拟键盘已隐藏时调用
    virtual void keyboardDidHide(CCIMEKeyboardNotificationInfo& info)    {CC_UNUSED_PARAM(info);}
protected:
    CCIMEDelegate();
};
    以上定义了虚拟键盘的接口方法,再看一看如何使用虚拟键盘。要显示虚拟键盘首先要在场景中加入一个继承自CCIMEDelegate的可显示的CCNode。在TestCpp工程的TextInputTest测试项有虚拟键盘的代码实例。代码定义了类KeyboardNotificationLayer,它从CCLayer和CCIMEDelegate继承而来,专门负责虚拟键盘操作。
    它的流程是将KeyboardNotificationLayer实例作为节点添加到上一层CCLayer中,因为KeyboardNotificationLayer继承于CCLayer,所以支持触屏事件。当用户触屏时,KeyboardNotificationLayer的触屏事件响应方法ccTouchEnded被调用,ccTouchEnded将调用onClickTrackNode方法,这个方法如下:
void TextFieldTTFDefaultTest::onClickTrackNode(bool bClicked)
{
    CCTextFieldTTF * pTextField = (CCTextFieldTTF*)m_pTrackNode;
    if (bClicked)
    {
        // TextFieldTTFTest be clicked
        CCLOG("TextFieldTTFDefaultTest:CCTextFieldTTF attachWithIME");
        pTextField->attachWithIME();
    }
    else
    {
        // TextFieldTTFTest not be clicked
        CCLOG("TextFieldTTFDefaultTest:CCTextFieldTTF detachWithIME");
        pTextField->detachWithIME();
    }
}
    现在应该显示出虚拟键盘了。
-------------------------------------------------------------------------------------------------------------------

注:本人在本博客的原创文章采用创作共用版权协议http://creativecommons.org/licenses/by-nc-sa/2.5/cn/), 要求署名、非商业用途和保持一致。要求署名包含注明我的网名及文章来源(我的博客地址:http://www.cnblogs.com/binbingg)。

[原创]cocos2d-x研习录-第三阶 特性之按键与虚拟键盘的更多相关文章

  1. [原创]cocos2d-x研习录-第三阶 特性之触屏

    游戏跟视频最大的区别就是互动,而手游(基于智能手机)主要靠触摸屏幕.重力传感和虚拟键盘等方式实现互动.这里主要记录Cocos2D-x对玩家触屏操作的处理. 在Cocos2D-x中触屏分为单点触屏和多点 ...

  2. [原创]cocos2d-x研习录-第三阶 特性之物理引擎

    游戏物理引擎是指在游戏中涉及物理现象的逻辑处理,它用于模拟现实世界的各种物理规律(如赛车碰撞.子弹飞行.物体掉落等),让玩家能够在游戏中有真实的体验. Cocos2D-x中支持Box2D和Chipmu ...

  3. [原创]cocos2d-x研习录-第三阶 特性之粒子系统

    我想接触过游戏引擎的同学,对粒子系统应该不会陌生.它用于解决由大量按一定规则运动(变化)的微小物质在计算机上的生成和显示问题.粒子系统在游戏中有着非常广泛的应用,可以模拟很多现象,如火花.爆炸.烟雾. ...

  4. [原创]cocos2d-x研习录-第三阶 特性之瓦片地图集

    由于一张大的世界地图或背景图片往往可以由屈指可数的几种地形来表示,每种地形对应于一张小的图片,我们称这些小的地形图片为瓦片.把这些瓦片拼接在一起,组合成一个完整的地图,这就是瓦片地图集的基本原理. C ...

  5. [原创]cocos2d-x研习录-第三阶 特性之调度器

    在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...

  6. [原创]cocos2d-x研习录-第三阶 特性之动作

    在前面的Cocos2D-x的概念类中,我们了解到节点类CCNode.导演类CCDirector.场景类CCScene.布景层类CCLayer和精灵类CCSprite等,这些类都是构成游戏画面的基本元素 ...

  7. [原创]cocos2d-x研习录-第三阶 特性之加速度传感器

    智能手机的游戏与应用中,也经常会用到加速传感器事件来丰富用户的体验,比如飞翔的企鹅(英文AirPenguin)游戏就是通过加速度传感器来控制角色的移动和跳跃方向.下面学习Cocos2D-x中如何使用加 ...

  8. [原创]cocos2d-x研习录-第三阶 多分辨率适配器

    在移动终端(智能手机)平台下开发游戏一般都会涉及到屏幕多分辨率适配问题,原因是手机款式多种多样,不同的款式存在有不同的尺寸,即使尺寸相同又可能存在不同的分辨率. 手机屏幕尺寸:指手机屏幕对角线长度. ...

  9. [原创]cocos2d-x研习录-第三阶 背景音乐和音效

    在游戏中,音效是一个不可或缺的部分,它可以为我们的游戏增加效果.音效在游戏中一般分为长时间的背景音乐和短促的特效音乐.Cocos2D-x支持多种常见音乐格式(mp3.wav等). Cocos2D-x提 ...

随机推荐

  1. StoryBoard解惑

    可以把StoryBoard看做是一组viewController对应的xib,以及它们之间的转换方式的集合.在StoryBoard中不仅可以看到 每个ViewController的布局样式,也可以明确 ...

  2. WebAPI返回数据类型解惑[转]

    最近开始使用WebAPI,上手很容易,然后有些疑惑 1.WebAPI默认返回什么数据类型,json还是xml? 2.怎么修改WebAPI的返回数据类型,我用IE浏览器请求返回的数据都是JSON格式的, ...

  3. Nginx 1.10.2 发布,高性能 Web 服务器

    Nginx 1.10.2 发布了.Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 更新内容: Changes with n ...

  4. 兼容性测试-如何使用IE11做低版本IE的兼容性测试

    操作步骤: 切换模式方法-按F12->展开显示->仿真菜单>在文档模式下拉框中选择IE版本

  5. cocos2d-x WebSocket

    WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术.在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道 ...

  6. CCF 201612-2 工资计算 java 解题

    问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算: 1) 个人所得 ...

  7. LINUX二十个基础命令

    LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...

  8. Session Tracking Approaches

    cookies url rewriting hidden field see also: http://www.informit.com/articles/article.aspx?p=29817&a ...

  9. google vr开源 cardboard

    https://developers.google.com/cardboard/android/ 待续

  10. strlen 字符型数组和字符数组 sizeof和strlen的区别 cin.get(input,Arsize)

    strlenstrlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值 ...