在上次键盘事件执行完毕之前按键时,我遇到键盘事件问题。我在这里有一个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.
};
答案 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
}
}
}