Cocos2d-x事件机制

2021-05-14 15:36发布


游戏中会有各种各样的处理用户输入的需求,例如当玩家按下了某个按键则飞机会发射一颗子弹,三消游戏中拖动屏幕中的方块移动会触发与其边上的方块交换等

          

       飞机大战操控                                                                                                               开心消消乐

那么在Cocos2d-x引擎中这部分功能是如何实现的呢?答案是通过事件分发机制响应用户事件,引擎不仅内置了常见的事件如触摸事件,键盘事件等,而且还提供了创建自定义事件的方法以满足我们在游戏的开发过程中特殊的事件响应需求。今天就来为大家讲解在Cocos2d-x引擎中如何使用事件分发机制来处理用户的输入。

事件相关基本概念

首先我们要搞清楚与事件相关的三个基本元素,它们分别为:

(1)事件监听器:负责接收事件,并执行预定义的事件处理函数

(2)事件分发器:负责发起通知

(3)事件对象:记录事件的相关信息

 

监听器的类型

监听器总共有5种类型,分别为:

1EventListenerTouch - 响应触摸事件

2EventListenerKeyboard - 响应键盘事件

3EventListenerAcceleration - 响应加速度事件

4EventListenMouse - 响应鼠标事件

5EventListenerCustom - 响应自定义事件

接下来重点给大家介绍触摸事件和键盘事件

一、触摸事件

触摸事件是手机游戏中最重要的事件,它易于创建,还能提供多种多样的功能。当你触摸移动设备的屏幕时,设备获取到触控位置,同时取得触控的内容,最后在程序中响应这个过程,这就是触摸事件流程处理。可以按照以下步骤进行:

//  创建一个"one by one" 触摸事件监听器(同时只能响应单点触摸)
auto listener1 = EventListenerTouchOneByOne::create();
// 给监听器追加响应回调函数-开始触摸
listener1->onTouchBegan = [](Touch* touch, Event* event){
    //在这里处理核心业务逻辑    
return true; 
};
// 给监听器追加响应回调函数-触摸中移动
listener1->onTouchMoved = [](Touch* touch, Event* event){
//核心业务代码
};
// 给监听器追加响应回调函数-结束触摸
listener1->onTouchEnded = [=](Touch* touch, Event* event){
    // 核心业务代码
};
//添加监听器
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, this);


可以看到,在使用触摸事件监听器时,可以监听三种不同的事件,每一个事件都有自己触发的时机。

三种事件及其触发时机:

(1)onTouchBegan 开始触摸屏幕时

(2)onTouchMoved 触摸屏幕,同时在屏幕上移动时

(3)onTouchEnded 结束触摸屏幕时


二、键盘事件


对于桌面游戏,一般需要通过键盘做一些游戏内的控制,这时你就需要监听键盘事件。Cocos2d-x 支持键盘事件,就像上节介绍的触摸事件一样。

创建键盘事件监听器:

auto listener = EventListenerKeyboard::create();
//绑定按键按下事件与按键抬起事件
listener->onKeyPressed = CC_CALLBACK_2(KeyboardTest::onKeyPressed, this);
listener->onKeyReleased = CC_CALLBACK_2(KeyboardTest::onKeyReleased, this);
//添加监听器到事件派发器
_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
// 按键按下回调函数
void KeyboardTest::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event)
{
        log("Key with keycode %d pressed", keyCode);
}
// 按键抬起回调函数
void KeyboardTest::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event)
{
        log("Key with keycode %d released", keyCode);
}

可以看到,在使用键盘事件监听器时,可以监听两种不同的事件,每一个事件都有自己的触发时机。

两种事件及触发时机:

onKeyPressed 按键被按下时

onKeyReleased 按下状态的按键被放开时

以上是对触屏事件和键盘事件的详细介绍,大家可以留言讨论。