【问题标题】:Moving player using keyboard listeners使用键盘监听器移动播放器
【发布时间】:2015-09-24 21:41:31
【问题描述】:

我有一个播放器类,具有 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)); }

但是有一个问题,当我尝试对对象而不是 sprite 以及位于单独类中而不是在同一个文件中的函数做同样的事情时。
如果我尝试在MainScene::keyPressed 中运行这样的代码:

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

player 每次按键仅移动一次(我希望它移动直到我释放该键),如果我尝试安排它或执行类似的操作,它不起作用或有错误。

我尝试使用CallFuncCCCallFunc 制作一些东西,但似乎没有任何效果。
请你帮助我好吗? :)

【问题讨论】:

    标签: c++ keyboard cocos2d-x cocos2d-x-3.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 调用它们?

    【讨论】:

    • 但是您的解决方案似乎不太理想,因为更新功能必须检查玩家在每一帧的每个键。而且还有更多的写作,因为每个动作都需要一个布尔值
    • update() 无论如何都会在每一帧上调用,并且仅检查 bool 值不会真正增加帧渲染时间,除非你有数百万个(但 GPU 无论如何也不会渲染这么多)。另外为什么要检查每个键?您只需听键盘事件,当发生变化时,您会更新“玩家”信息(isMoving、移动方向和其他内容)。这就是我认为应该这样做的方式——玩家应该“关心”自己,任何运动逻辑都应该在其中。如果您有不同类型的对象要移动,您应该使用通用数据创建类,其他人会扩展它。
    猜你喜欢
    • 1970-01-01
    • 2020-05-30
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2020-05-24
    • 1970-01-01
    • 2013-11-15
    相关资源
    最近更新 更多