如何在当前键盘事件完成之前停止捕获键盘事件?
How to stop capturing Keyboard event until current keyboard event finish?
在最后一个键盘事件执行完毕之前按下按键时,我遇到了键盘事件问题。这里我有一个 onKeyPressed 事件:
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.
};
假设我的角色现在在位置 x 当我按下 KEY_RIGHT_ARROW 时,我的角色在 3 秒 后开始向右移动 900 像素。但是,在我按下 KEY_UP_ARROW 后 1 秒。现在我期望我的角色继续移动直到他到达目标 (x + 900) 然后跳,但 事实上 他跳到他原来的地方当我按下 KEY_UP_ARROW.
我想到的 2 个解决方案是,我需要以某种方式阻止我的应用程序捕获任何新的键盘事件,直到当前事件完成或将它们保存在某个地方并稍后以先进先出的顺序执行它们。所以:
1/ 这样处理好吗?如果是,那该怎么做?
2/还有其他解决方案吗?
非常感谢您的帮助。
更新:我试图设置一个标志来防止新的键盘事件,但它仍然是一样的:
int flag = 0;
keyBoardListener->onKeyPressed =
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){
if(flag==0)
{
flag++;
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.
flag--;
}
};
我想,最简单的方法是将动作存储在向量中,如下所示:
在 .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
}
}
}
在最后一个键盘事件执行完毕之前按下按键时,我遇到了键盘事件问题。这里我有一个 onKeyPressed 事件:
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.
};
假设我的角色现在在位置 x 当我按下 KEY_RIGHT_ARROW 时,我的角色在 3 秒 后开始向右移动 900 像素。但是,在我按下 KEY_UP_ARROW 后 1 秒。现在我期望我的角色继续移动直到他到达目标 (x + 900) 然后跳,但 事实上 他跳到他原来的地方当我按下 KEY_UP_ARROW.
我想到的 2 个解决方案是,我需要以某种方式阻止我的应用程序捕获任何新的键盘事件,直到当前事件完成或将它们保存在某个地方并稍后以先进先出的顺序执行它们。所以:
1/ 这样处理好吗?如果是,那该怎么做?
2/还有其他解决方案吗?
非常感谢您的帮助。
更新:我试图设置一个标志来防止新的键盘事件,但它仍然是一样的:
int flag = 0;
keyBoardListener->onKeyPressed =
[&](cocos2d::EventKeyboard::KeyCode keycode, Event* event){
if(flag==0)
{
flag++;
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.
flag--;
}
};
我想,最简单的方法是将动作存储在向量中,如下所示:
在 .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
}
}
}