如何在cocos2d-x中捕捉按住键盘事件?
我这里有一个功能,可以在每个按键上移动精灵。现在我还想按住键移动它,而不是反复按键,但我不知道怎么做。请引导我,非常感谢你的帮助如何在cocos2d-x中捕捉按住键盘事件?,cocos2d-x,Cocos2d X,我这里有一个功能,可以在每个按键上移动精灵。现在我还想按住键移动它,而不是反复按键,但我不知道怎么做。请引导我,非常感谢你的帮助 keyBoardListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event) { Vec2 location = event->getCurrentTarget()->getPosition(); switch (keyCod
keyBoardListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event)
{
Vec2 location = event->getCurrentTarget()->getPosition();
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
case EventKeyboard::KeyCode::KEY_A:
event->getCurrentTarget()->setPosition(location.x - 10.0f, location.y);
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
case EventKeyboard::KeyCode::KEY_D:
event->getCurrentTarget()->setPosition(location.x + 10.0f, location.y);
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
case EventKeyboard::KeyCode::KEY_W:
event->getCurrentTarget()->setPosition(location.x, location.y + 10.0f);
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
case EventKeyboard::KeyCode::KEY_S:
event->getCurrentTarget()->setPosition(location.x, location.y - 10.0f);
break;
}
};
当按下一个键时,没有连续触发的事件,因此解决问题的一种方法是使用一个全局(或类或其他)变量来跟踪x轴上的移动,另一个用于y轴 为了只使用两个变量,而不是每个键单独使用一个变量,您可以使用2个整数,比如xMovement和yMovement,并根据按下的键将它们的值设置为-1、0或1。如果xMovement为-1,则将精灵向左移动,如果为1,则将其向右移动,如果为0,则根本不移动。y轴也是这样。要实现这一点,您应该如下更改代码:
keyBoardListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event)
{
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
case EventKeyboard::KeyCode::KEY_A:
xMovement--;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
case EventKeyboard::KeyCode::KEY_D:
xMovement++;
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
case EventKeyboard::KeyCode::KEY_W:
yMovement++;
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
case EventKeyboard::KeyCode::KEY_S:
yMovement--;
break;
}
};
现在还应添加一个按键释放事件,其中递增/递减应与按键事件相反:
keyBoardListener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* event)
{
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
case EventKeyboard::KeyCode::KEY_A:
xMovement++;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
case EventKeyboard::KeyCode::KEY_D:
xMovement--;
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
case EventKeyboard::KeyCode::KEY_W:
yMovement--;
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
case EventKeyboard::KeyCode::KEY_S:
yMovement++;
break;
}
};
现在,要真正移动精灵,只需在每帧调用的更新函数中执行以下操作:
float newPosX = sprite->getPositionX() + (xMovement * 10.f);
float newPosY = sprite->getPositionY() + (yMovement * 10.f);
sprite->setPosition(newPosX, newPosY);
您还需要一些机制来确保xMovement和yMovement保持在边界内(在我的示例中,如果同时按下向左箭头和“a”键,精灵的移动速度将增加一倍:p),但这只是一个粗略的示例,演示了如何使用键盘事件和更新功能实现连续移动。按键时没有连续触发的事件,因此解决问题的一种方法是使用全局(或类或其他)按钮变量,用于跟踪x轴和y轴上的移动 为了只使用两个变量,而不是每个键单独使用一个变量,您可以使用2个整数,比如xMovement和yMovement,并根据按下的键将它们的值设置为-1、0或1。如果xMovement为-1,则将精灵向左移动,如果为1,则将其向右移动,如果为0,则根本不移动。y轴也是这样。要实现这一点,您应该如下更改代码:
keyBoardListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event)
{
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
case EventKeyboard::KeyCode::KEY_A:
xMovement--;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
case EventKeyboard::KeyCode::KEY_D:
xMovement++;
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
case EventKeyboard::KeyCode::KEY_W:
yMovement++;
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
case EventKeyboard::KeyCode::KEY_S:
yMovement--;
break;
}
};
现在还应添加一个按键释放事件,其中递增/递减应与按键事件相反:
keyBoardListener->onKeyReleased = [](EventKeyboard::KeyCode keyCode, Event* event)
{
switch (keyCode)
{
case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
case EventKeyboard::KeyCode::KEY_A:
xMovement++;
break;
case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
case EventKeyboard::KeyCode::KEY_D:
xMovement--;
break;
case EventKeyboard::KeyCode::KEY_UP_ARROW:
case EventKeyboard::KeyCode::KEY_W:
yMovement--;
break;
case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
case EventKeyboard::KeyCode::KEY_S:
yMovement++;
break;
}
};
现在,要真正移动精灵,只需在每帧调用的更新函数中执行以下操作:
float newPosX = sprite->getPositionX() + (xMovement * 10.f);
float newPosY = sprite->getPositionY() + (yMovement * 10.f);
sprite->setPosition(newPosX, newPosY);
您还需要一些机制来确保xMovement和yMovement保持在边界内(在我的示例中,如果同时按下左箭头和“a”键,精灵的移动速度将提高一倍:p),但这只是一个粗略的示例,演示如何使用键盘事件和更新功能实现连续移动