如何在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),但这只是一个粗略的示例,演示如何使用键盘事件和更新功能实现连续移动