如何在Cocos2d-X?(C++)中检查持续按键

lyr7nygr  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(125)

我一直在尝试在cocosd 2x-x中编写/开发一个函数,当一个键被按下时,它会执行一个指定的动作 (在我的例子中是移动玩家精灵);由于Cocos2d-x没有特定的选项(只有OnKeyPressedOnKeyReleased)。
我试图通过利用Coco 2d的SchedueledUpdate()来解决这个问题,它使用增量时间更新每一帧。
Level1Scene.h
中定义函数后:第一个月
我在Level1Scene.cpp中调用它,并尝试将其与名为 Knight 的玩家精灵关联:

void Level1::UpdateMove(float dt) {

    if (::DirX == -1) {
        Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(-10, 0);
    }

    if (::DirX == -1) {
        Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(+10, 0);
    }

    if (::DirY == -1) {
        Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(0, -10);
    }

    if (::DirY == 1) {
        Director::getInstance()->getRunningScene()->getChildByName("Knight")->setPosition(0, +10);
    }
}

如你所见,DirX和DirY都是全局int变量,它们的值被调用,然后指示游戏GetInstance-〉GetRunningScene()-〉GetChildByName(“Knight”),这个玩家精灵的位置会根据**bool Level 1::init()**中不同函数的按钮输入设置而减少或增加。

auto eventListener = EventListenerKeyboard::create();

    eventListener->onKeyPressed = [](EventKeyboard::KeyCode keyCode, Event* event) {

        switch (keyCode) {
        case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
        case EventKeyboard::KeyCode::KEY_A:
            ::DirX = -1;
            break;
        case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
        case EventKeyboard::KeyCode::KEY_D:
            ::DirX = 1;
            break;
        case EventKeyboard::KeyCode::KEY_UP_ARROW:
        case EventKeyboard::KeyCode::KEY_W:

            ::DirY = -1;
            break;
        case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
        case EventKeyboard::KeyCode::KEY_S:
            ::DirY = +1;
            break;
        }
    };

    this->scheduleUpdate();

为什么不管用?

wribegjk

wribegjk1#

  • 更新此内容,以防将来其他人在此问题上遇到解决方案:*

在做了大量的A/B测试后,我发现主要问题来自更新功能不识别我所指的sprite。在做了一些挖掘后,我也解开了我的主要问题在于:
第一个月
这个函数显然有缺陷,并且不获取当前场景沿着指定的子对象(* 尽管使用了-〉setName(“Knight”)*。
为了解决这个问题,我在函数外部声明了三个全局变量:

int DirX = 0 ;
int DirY = 0 ;
cocos2d::Sprite* Knight;

之后,我在 init 函数中调用了全局knight变量:

::Knight= Sprite::create("Knight.png");
::Knight->setPosition(Vec2(200, 115));
::Knight->setScale(0.3);
this->addChild(Knight);

以及键盘侦听器事件中的DirX和DirY:

keyboardListener->onKeyPressed = [=](EventKeyboard::KeyCode keyCode, Event* event)
{
    switch (keyCode)
    {
    case EventKeyboard::KeyCode::KEY_W:
    case EventKeyboard::KeyCode::KEY_UP_ARROW:
        DirY += 3.0f;
        break;
    case EventKeyboard::KeyCode::KEY_A:
    case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
        DirX -= 3.0f;
        break;
    case EventKeyboard::KeyCode::KEY_S:
    case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
        DirY -= 3.0f;
        break;
    case EventKeyboard::KeyCode::KEY_D:
    case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
        DirX += 3.0f;
        break;
    }
};

keyboardListener->onKeyReleased = [=](EventKeyboard::KeyCode keyCode, Event* event)
{
    switch (keyCode)
    {
    case EventKeyboard::KeyCode::KEY_W:
    case EventKeyboard::KeyCode::KEY_UP_ARROW:
        DirY -= 3.0f;
        break;
    case EventKeyboard::KeyCode::KEY_A:
    case EventKeyboard::KeyCode::KEY_LEFT_ARROW:
        DirX += 3.0f;
        break;
    case EventKeyboard::KeyCode::KEY_S:
    case EventKeyboard::KeyCode::KEY_DOWN_ARROW:
        DirY += 3.0f;
        break;
    case EventKeyboard::KeyCode::KEY_D:
    case EventKeyboard::KeyCode::KEY_RIGHT_ARROW:
        DirX -= 3.0f;
        break;
    }
};

this->_eventDispatcher->addEventListenerWithSceneGraphPriority(keyboardListener, this);

this->scheduleUpdate();

请注意,我使用了带有计数器值的onKeyPressed和onKeyReleased来修复任何与移动相关的问题。
最后,在update函数中,我运行一个常量检查,以检查每帧更新玩家位置的值。
void级别1::更新(浮点日期){

float newPosX = ::Knight->getPositionX() + (DirX);
float newPosY = ::Knight->getPositionY() + (DirY);

::Knight->setPosition(newPosX, newPosY);

}

相关问题