我在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时,它应该在第一个实例中沿该方向移动整个碰撞盒,然后以正常速度移动.