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

时间:2015-09-24 21:41:31

标签: c++ keyboard cocos2d-x cocos2d-x-3.0

我有一个玩家类,有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");

另外,我在keyPressed中有一个功能keyReleasedMainScene
keyPressed函数中,我使用if:

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

但是有一个问题,当我尝试用对象而不是精灵做同样的事情,并且函数位于分离的类中,而不是在同一个文件中。
如果我尝试在MainScene::keyPressed中运行这样的代码:

if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_W) { this->player->MoveLeft(5); }

player每次按键只移动一次(我希望它移动直到我释放该键),如果我尝试安排它或做这样的事情,它就不起作用或有错误。

我尝试使用CallFuncCCCallFunc制作内容,但似乎没有任何效果 请你帮助我好吗? :)

1 个答案:

答案 0 :(得分:1)

为什么不在Player类中创建方法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调用它们?