如何结合角度限制带MAX_SPEED的汽车X、Y偏移量?
我开发了一款俯视视角的汽车控制游戏,使用以下变量控制汽车移动:
MAX_SPEED为5(表示每帧最多移动5像素)FORWARD_ACC(加速度)为0.25(加速时每帧速度提升0.25像素)speed(汽车速度,为向量[0,0]:[x偏移量, y偏移量])acceleration(汽车加速度,同样为向量[x加速度, y加速度])angle(汽车角度,单位为弧度)
通过这些变量,我可以根据汽车的俯视角度分配加速度,计算公式为:acceleration = [cos(angle)*FORWARD_ACC, sin(angle)*FORWARD_ACC]。
例如,当角度为π/2弧度(对应Pygame中90度,向下行驶)时,加速度向量为[0, 0.25];角度为π弧度(对应Pygame中180度,向左行驶)时,加速度向量为[-0.25, 0]。
我通过以下函数将加速度添加到速度中:
def add_acc_to_speed(speed, acceleration): returned_speed = [speed[0]+acceleration[0], speed[1]+acceleration[1]] return(returned_speed if abs(returned_speed[0])+abs(returned_speed[1])<MAX_SPEED else speed)
该函数原本意图限制|x偏移量| + |y偏移量|的总和不超过MAX_SPEED,确保汽车速度不超过5像素/帧。
当前函数的问题在于,当总和超过5时会直接返回传入的speed参数,导致依赖汽车角度的新acceleration未被纳入计算。
例如,汽车向右行驶达到最大速度后,尝试转向下方向时,只要Y偏移量的加速度不高于X偏移量,汽车就无法正常转向,会持续侧移。只有当Y加速度超过X加速度时,汽车才会正常转向,这导致转向生硬,汽车大多只能沿上下左右方向行驶。
当前的速度限制逻辑导致,其中一个偏移量必须降低,另一个才能升高,但只要需要降低的偏移量的加速度更高,这种情况就不会发生。
- 为每个偏移量单独设置
MAX_SPEED限制:导致对角线行驶时速度过快(如[5,5]) - 为每个偏移量单独设置
MAX_SPEED//2限制:解决了对角线问题,但单方向行驶速度仅为2.5(如[2.5,0]) - 考虑动态修改
MAX_SPEED值,寻找折中方案,但尚未尝试
我知道问题根源在于返回原speed参数,未考虑新的acceleration和angle,需要优化速度限制逻辑。
根据@SimonGoater的建议调整后,汽车可以转圈,但仍存在转向延迟问题:当速度超过MAX_SPEED时,函数返回原speed,导致汽车朝向右下角时仍几乎向右行驶。
(注:若速度显示0.05而加速度为0.17,是因为游戏中存在摩擦力,本问题可忽略该因素)
内容的提问来源于stack exchange,提问作者diogeek

