在cocos2d-x的交互功能中,必不可免的会有键盘响应的事件(除了PC端游戏会用到键盘,现在有些手机或者平板也会插上键盘来进行辅助) 对于键盘事件的监听,许多教程或者书本上都有讲述。但是对于键盘具体按键的判断,许多教程书籍上并没有提到。笔者查阅了一下资料以及键盘事件的头文件,得到了一个相对简便的方法。
首先我们先创建一个事件监听器监听键盘事件
"HelloWorldScene.h"
//在HelloWorldScene.h头文件中重写键盘按下弹回的两个方法
virtual void onKeyPressed(EventKeyboard::KeyCode keycode, Event *event);
virtual void onKeyReleased(EventKeyboard::KeyCode keycode, Event *event);
"HelloWorldScene.cpp"
auto *dispatcher = Director::getInstance()->getEventDispatcher();
auto* keyListener = EventListenerKeyboard::create();
//创建一个事件监听器监听键盘事件
keyListener->onKeyPressed = CC_CALLBACK_2(HelloWorld::onKeyPressed, this);
//键盘被按下时响应
keyListener->onKeyReleased = CC_CALLBACK_2(HelloWorld::onKeyReleased, this);
//键盘按键被弹回时响应
dispatcher->addEventListenerWithSceneGraphPriority(keyListener,this);
许多教程书籍上对于键盘响应事件的讲解大多到这里就截止了,对于如何判断键盘按下的是哪个键大多读者都是十分迷茫。
其实判断键盘按键的方法就在键盘响应事件方法的第一个参数上:EventKeyboard::KeyCode keycode。对,就是EventKeyboard::KeyCode,KeyCode定义了键盘上所有的按键。
下面我们来看一下"CCEventKeyboard.h"头文件中KeyCode的定义
enum class KeyCode
{
KEY_NONE,
KEY_PAUSE,
KEY_SCROLL_LOCK,
KEY_PRINT,
KEY_SYSREQ,
KEY_BREAK,
KEY_ESCAPE,
KEY_BACK = KEY_ESCAPE,
KEY_BACKSPACE,
KEY_TAB,
KEY_BACK_TAB,
KEY_RETURN,
KEY_CAPS_LOCK,
KEY_SHIFT,
KEY_LEFT_SHIFT = KEY_SHIFT,
KEY_RIGHT_SHIFT,
KEY_CTRL,
KEY_LEFT_CTRL = KEY_CTRL,
KEY_RIGHT_CTRL,
KEY_ALT,
KEY_LEFT_ALT = KEY_ALT,
KEY_RIGHT_ALT,
KEY_MENU,
KEY_HYPER,
KEY_INSERT,
KEY_HOME,
KEY_PG_UP,
KEY_DELETE,
KEY_END,
KEY_PG_DOWN,
KEY_LEFT_ARROW,
KEY_RIGHT_ARROW,
KEY_UP_ARROW,
KEY_DOWN_ARROW,
KEY_NUM_LOCK,
KEY_KP_PLUS,
KEY_KP_MINUS,
KEY_KP_MULTIPLY,
KEY_KP_DIVIDE,
KEY_KP_ENTER,
KEY_KP_HOME,
KEY_KP_UP,
KEY_KP_PG_UP,
KEY_KP_LEFT,
KEY_KP_FIVE,
KEY_KP_RIGHT,
KEY_KP_END,
KEY_KP_DOWN,
KEY_KP_PG_DOWN,
KEY_KP_INSERT,
KEY_KP_DELETE,
KEY_F1,
KEY_F2,
KEY_F3,
KEY_F4,
KEY_F5,
KEY_F6,
KEY_F7,
KEY_F8,
KEY_F9,
KEY_F10,
KEY_F11,
KEY_F12,
KEY_SPACE,
KEY_EXCLAM,
KEY_QUOTE,
KEY_NUMBER,
KEY_DOLLAR,
KEY_PERCENT,
KEY_CIRCUMFLEX,
KEY_AMPERSAND,
KEY_APOSTROPHE,
KEY_LEFT_PARENTHESIS,
KEY_RIGHT_PARENTHESIS,
KEY_ASTERISK,
KEY_PLUS,
KEY_COMMA,
KEY_MINUS,
KEY_PERIOD,
KEY_SLASH,
KEY_0,
KEY_1,
KEY_2,
KEY_3,
KEY_4,
KEY_5,
KEY_6,
KEY_7,
KEY_8,
KEY_9,
KEY_COLON,
KEY_SEMICOLON,
KEY_LESS_THAN,
KEY_EQUAL,
KEY_GREATER_THAN,
KEY_QUESTION,
KEY_AT,
KEY_CAPITAL_A,
KEY_CAPITAL_B,
KEY_CAPITAL_C,
KEY_CAPITAL_D,
KEY_CAPITAL_E,
KEY_CAPITAL_F,
KEY_CAPITAL_G,
KEY_CAPITAL_H,
KEY_CAPITAL_I,
KEY_CAPITAL_J,
KEY_CAPITAL_K,
KEY_CAPITAL_L,
KEY_CAPITAL_M,
KEY_CAPITAL_N,
KEY_CAPITAL_O,
KEY_CAPITAL_P,
KEY_CAPITAL_Q,
KEY_CAPITAL_R,
KEY_CAPITAL_S,
KEY_CAPITAL_T,
KEY_CAPITAL_U,
KEY_CAPITAL_V,
KEY_CAPITAL_W,
KEY_CAPITAL_X,
KEY_CAPITAL_Y,
KEY_CAPITAL_Z,
KEY_LEFT_BRACKET,
KEY_BACK_SLASH,
KEY_RIGHT_BRACKET,
KEY_UNDERSCORE,
KEY_GRAVE,
KEY_A,
KEY_B,
KEY_C,
KEY_D,
KEY_E,
KEY_F,
KEY_G,
KEY_H,
KEY_I,
KEY_J,
KEY_K,
KEY_L,
KEY_M,
KEY_N,
KEY_O,
KEY_P,
KEY_Q,
KEY_R,
KEY_S,
KEY_T,
KEY_U,
KEY_V,
KEY_W,
KEY_X,
KEY_Y,
KEY_Z,
KEY_LEFT_BRACE,
KEY_BAR,
KEY_RIGHT_BRACE,
KEY_TILDE,
KEY_EURO,
KEY_POUND,
KEY_YEN,
KEY_MIDDLE_DOT,
KEY_SEARCH,
KEY_DPAD_LEFT,
KEY_DPAD_RIGHT,
KEY_DPAD_UP,
KEY_DPAD_DOWN,
KEY_DPAD_CENTER,
KEY_ENTER,
KEY_PLAY
};
看到这想必绝大多数读者就已经明白了,就是判断键盘按键所产生的EventKeyboard::KeyCode 的值。 下面写个例子
//重写onKeyPressed方法来实现具体按键的判断
void HelloWorld::onKeyPressed(EventKeyboard::KeyCode keycode, Event *event) {
if (keycode == EventKeyboard::KeyCode::KEY_UP_ARROW) {
CCLOG("按下了:上方向键");
}
else if (keycode == EventKeyboard::KeyCode::KEY_LEFT_ARROW) {
CCLOG("按下了:左方向键");
}
else if (keycode == EventKeyboard::KeyCode::KEY_RIGHT_ARROW) {
CCLOG("按下了:右方向键");
}
else if (keycode == EventKeyboard::KeyCode::KEY_DOWN_ARROW) {
CCLOG("按下了:下方向键");
}
}
这样键盘按键通过与KeyCode的定义值进行比较,可以判断出键盘是否按出来我们所需要的键。当然要得出按下了哪一个键,通过输出KeyCode的值就可以得到了。