cocos2d-x 4.0 学习之路(二十)忍者来袭-让主角动起来-监听键盘事件
程序员文章站
2022-06-18 10:06:07
cocos2dx提供了监听键盘的两种事件,键盘按下和键盘抬起。auto listener = EventListenerKeyboard::create();listener->onKeyPressed = CC_CALLBACK_2(KeyboardTest::onKeyPressed, this);listener->onKeyReleased = CC_CALLBACK_2(KeyboardTest::onKeyReleased, this);...
在忍者来袭的小游戏中,有一个非常大的缺憾,就是主角一直是静止不动,只能呆呆的发飞镖。这对于玩家的交互体验是非常差的。
那么,这节我们就让主角的忍者动起来,让他可以灵活移动,躲避敌人的进攻。
涉及到的知识点是键盘的监听事件。
cocos2dx提供了监听键盘的两种事件,键盘按下和键盘抬起。
具体的代码如下,也比较简单:
// 先建立一个键盘listener
auto listener = EventListenerKeyboard::create();
listener->onKeyPressed = CC_CALLBACK_2(KeyboardTest::onKeyPressed, this); // 定义按下事件
listener->onKeyReleased = CC_CALLBACK_2(KeyboardTest::onKeyReleased, this); // 定义抬起事件
// 注册键盘Listener
_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);
}
那么,在忍者来袭的代码中,具体实现如下:
// NinjaAttack_Level1.h
void onKeyPressed(EventKeyboard::KeyCode keyCode, Event* events);
// NinjaAttack_Level1.cpp
// 在init()中加入键盘监听事件
// 键盘事件监听
auto keyListener = EventListenerKeyboard::create();
keyListener->onKeyPressed = CC_CALLBACK_2(NA_Level1::onKeyPressed, this);
_eventDispatcher->addEventListenerWithSceneGraphPriority(keyListener, this);
// NinjaAttack_Level1.cpp
void NA_Level1::onKeyPressed(EventKeyboard::KeyCode keyCode, Event* event) {
log("Key with keycode %d pressed", keyCode);
switch (keyCode) {
case EventKeyboard::KeyCode::KEY_D:
{
auto moveBy = MoveBy::create(0.5f, Vec2(20, 0));
_player->runAction(Sequence::create(moveBy, nullptr));
break;
}
case EventKeyboard::KeyCode::KEY_A:
{
auto moveBy = MoveBy::create(0.5f, Vec2(-20, 0));
_player->runAction(Sequence::create(moveBy, nullptr));
break;
}
case EventKeyboard::KeyCode::KEY_W:
{
auto moveBy = MoveBy::create(0.5f, Vec2(0, 20));
_player->runAction(Sequence::create(moveBy, nullptr));
break;
}
case EventKeyboard::KeyCode::KEY_S:
{
auto moveBy = MoveBy::create(0.5f, Vec2(0, -20));
_player->runAction(Sequence::create(moveBy, nullptr));
break;
}
default:
break;
}
}
这里面的KeyCode就是对应键盘的按键,我定义的W、S、A、D代表上下左右。
其他比如:KEY_0 代表数字0,KEY_SPACE代表空格等等,这个可以自己查一下。
完活了, 看一下效果:
还算不错,移动起来还算灵活,这个灵活度就是看你设定的每按一次移动多少距离和所用时间了。唯一的缺点就是没有持续按键的监听功能,你必须得抬起按键然后再点。希望以后API能够改善。
本文地址:https://blog.csdn.net/sunnyboychina/article/details/109255228