c – Snake游戏:快速响应与碰撞错误

我在SFML C中有一个蛇游戏,我被困在两个选项之间.如果设置控件如下:

    if(event.type == sf::Event::KeyPressed && (event.key.code == sf::Keyboard::Up
            || event.key.code == sf::Keyboard::W) && move != Down)
        move = Up;

    else if(event.type == sf::Event::KeyPressed && (event.key.code == sf::Keyboard::Down
            || event.key.code == sf::Keyboard::S) && move != Up)
        move = Down;

    else if(event.type == sf::Event::KeyPressed && (event.key.code == sf::Keyboard::Left
            || event.key.code == sf::Keyboard::A)&& move != Right)
        move = Left;

    else if(event.type == sf::Event::KeyPressed && (event.key.code == sf::Keyboard::Right
            || event.key.code == sf::Keyboard::D) && move != Left)
        move = Right;

在这里,控件非常敏感.问题是,例如,如果蛇向右走,你要向上按,然后向左快速连续按下,蛇就不会向上移动,但向上控制将被缓冲,所以蛇将被允许向左移动自己,因此死亡.

相反,如果我将这些移动条件包装在if语句中,该语句只允许每帧更新一次错误,但控件的平滑性和响应性要差得多.

所以我的问题是,如何保持运动快速更新的响应能力,同时避免进入自身的错误?

最佳答案 是你制作蛇;问题不在于你的输入(但那些“如果”应该是一个switch语句),而是在与输入作出反应的Object中,例如. “Snake_Object”.正常游戏在按下方向时强制设定数量的位置移动.如果你观看比赛,如果你向上按,那么蛇就会被迫立即从上面的一个碰撞盒上方.这可以确保您无法进行不必要的即时碰撞,并且仍能保持常规的fps流量.

因此,当移动变量被发送到Snake时,它应该在第一个实例中沿该方向移动整个碰撞盒,然后以正常速度移动.

点赞