使用键盘监听器移动播放器

Moving player using keyboard listeners

我有一个播放器 class,具有 MoveUpMoveLeftMoveRight 功能。
MainScene.cpp(我目前唯一的场景),我有一个听众

auto keyboardListener = EventListenerKeyboard::create();
keyboardListener->onKeyPressed = CC_CALLBACK_2(MainScene::keyPressed, this);
keyboardListener->onKeyReleased = CC_CALLBACK_2(MainScene::keyReleased, this);

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(keyboardListener, this);

另外,我有一个指针player,由

定义
this->player = rootNode->getChildByName<Player*>("Player1");

此外,我在 MainScene 中有一个函数 keyPressedkeyReleased
keyPressed 函数中,我使用 if 调度函数:

if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_D) { schedule(schedule_selector(MainScene::MoveRight)); }

但是有一个问题,当我试图用对象而不是精灵和位于不同 class 的函数做同样的事情时,而不是在同一个文件中。
如果我尝试 运行 在 MainScene::keyPressed:

中编写这样的代码
if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_W) { this->player->MoveLeft(5); }

player 每次按键只移动一次(我希望它移动直到我释放那个键),如果我尝试安排它或做类似的事情,它不起作用或那里是错误。

我尝试用 CallFuncCCCallFunc 做点什么,但似乎没什么用。
请你帮助我好吗? :)

为什么不在 Player class 中创建方法 startMoving() 和 stopMoving()? 像这样:

void Player::init(){
    scheduleUpdate()
}

void Play::startMoving(){
    isMoving = true;
}

void Player::stopMoving(){
    isMoving = false;
}

void Player::update(float delta){
    if(isMoving){
        //move player here
        sprite->setPositionX(sprite->getPositionX() + speed * delta);
    }
}

然后从 keyPressed/keyReleased?

呼叫他们