cocos2d-x 4.0 学习之路(二十)忍者来袭-让主角动起来-监听键盘事件

在忍者来袭的小游戏中,有一个非常大的缺憾,就是主角一直是静止不动,只能呆呆的发飞镖。这对于玩家的交互体验是非常差的。
那么,这节我们就让主角的忍者动起来,让他可以灵活移动,躲避敌人的进攻。
涉及到的知识点是键盘的监听事件。
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

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐