代码之家  ›  专栏  ›  技术社区  ›  Sagittario

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

  •  1
  • Sagittario  · 技术社区  · 10 年前

    我有一个球员课程 MoveUp , MoveLeft MoveRight 功能。
    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 keyReleased 在里面 MainScene .
    在里面 按键已按下 函数,我用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); }
    

    , 游戏者 每次按键只移动一次(我希望它移动,直到我释放该键),如果我尝试安排它或执行类似的操作,它不会工作或出现错误。

    我试着用 CallFunc CCCallFunc ,但似乎没有任何效果。
    你能帮我吗

    1 回复  |  直到 10 年前
        1
  •  1
  •   Makalele    10 年前

    为什么不在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呼叫他们?