如何停止捕获键盘事件直到当前键盘事件结束?

时间:2017-03-23 10:15:47

标签: cocos2d-x

在上次键盘事件执行完毕之前按键时,我遇到键盘事件问题。我在这里有一个onKeyPressed事件:

%PDF-1.7
%����

414 0 obj
<</Linearized 1/L 696774/O 417/E 31849/N 13/T 688378/H [ 716 821]>>
endobj

xref
414 21
0000000016 00000 n
0000001537 00000 n...

让我们说我的角色现在处于位置x当我按下KEY_RIGHT_ARROW时,我的角色开始在 3秒中向右移动900像素。但是, 1秒后我按下KEY_UP_ARROW。现在我期待我的角色一直移动直到他到达目标(x + 900)然后跳跃,但实际上他跳到他按下KEY_UP_ARROW时的位置。< / p>

我想到的两个解决方案是,我需要以某种方式阻止我的应用程序捕获任何新的键盘事件,直到当前事件完成或将它们保存在某处并稍后以先进先出序列执行它们。所以:

1 /这是处理它的好方法吗?如果是,那该怎么做?

2 /还有其他解决方案吗?

非常感谢您的帮助。

更新:我试图设置一个标志来阻止新的键盘事件,但它仍然是相同的:

keyBoardListener->onKeyPressed = 
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){
    switch (keycode)
      case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
      // Move 900 pixel to the Right in 3s
      case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW:
      // Jump.
};

1 个答案:

答案 0 :(得分:1)

我想,最简单的方法是将动作存储在矢量中,如下所示:

在.h文件中

virtual void update(float delta) override;
Vector<ActionInterval* > actions;

然后在.cpp文件中:

keyBoardListener->onKeyPressed = 
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){

   switch (keycode)
      case cocos2d::EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
            // Move 900 pixel to the Right in 3s
            auto newAction = MoveBy::create(3.0f, Vec2(900, 0));
            newAction->setTag(101);
            actions.pushBack(newAction);

      case cocos2d::EventKeyboard::KeyCode::KEY_UP_ARROW:
              // Jump.
            auto newAction = MoveBy::create(3.0f, Vec2(0, 500));
            newAction->setTag(101);
            actions.pushBack(newAction);

};

scheduleUpdate();

void MyScene::update(float delta){
    if(sprite->getActionByTag(101) == nullptr){ //idle
        if(actions.size() > 0){ //get oldest action
            auto action = actions.at(0);
            actions.erase(0); //remove it from vector
            sprite->runAction(action); //play it
        }
    }
}