我有一个游戏,我可以在自上而下的视图中控制汽车。我使用多个变量来移动它。
MAX_SPEED
是5
。 (意味着它每次最多可以移动 5px)FORWARD_ACC
(用于加速)是0.25
(意味着加速时每刻速度增加四分之一像素)。speed
(这是一个向量[0,0]
:[x offset, y offset]
)。acceleration
(也是一个向量[x acc, y acc]
)。angle
(以弧度表示)。这些变量允许我根据自上而下视图中的角度为汽车分配加速度。
我用三角函数计算
acceleration
值:acceleration = [cos(angle)*FORWARD_ACC, sin(angle)*FORWARD_ACC]
。
因此,当以 pi/2 弧度的
0.25
加速 (angle
px) 时(正在下降,因此在 pygame 中为 90 度),我的 acceleration
向量将是 [0, 0.25]
。当以 pi 弧度的 angle
移动时(向左移动,因此在 pygame 中为 180 度),我的 acceleration
向量将是 [-0.25, 0]
。
然后我使用此函数将
acceleration
添加到速度中:
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 offset| + |y offset|
的总和不能超过 MAX_SPEED
。这样汽车的行驶速度就不会超过 5
px。
问题是,如您所见,如果总和大于 5,该函数将返回传递的
speed
参数。这样做的副作用是新的 acceleration
,它作为参数传递,并且 depends不考虑汽车的角度。
基本上,假设您的汽车行驶一段时间并迅速达到最大速度。如果您尝试向下转向,只要您与加速度变量的 Y 偏移量不高于 x 偏移量,您的汽车就不会转向,而是会向侧面行驶 。因此,例如,如果我有 [0.19, 0.16]
,在开始考虑
0.16
之前,我仍然会向右走 30 秒(只是因为 0.19 不是 0.25,所以 x 偏移量正在慢慢减少,允许更多)我允许的窗口中的“空间”,它受到 max_speed 的限制。 现在假设您转动多一点,您的
acceleration
值现在为
[0.17,0.18]
。由于加速度的 Y 偏移现在高于 X 偏移,因此汽车将按预期转弯。这会导致奇怪的急转弯,并且汽车大多向上、向下、向左或向右: TL;博士:
acceleration
值。
MAX_SPEED
限制(这会导致两个偏移量都能够达到5(
[5,5]
)并且汽车在对角线行驶时速度太快)。
MAX_SPEED//2
限制(这解决了对角线问题,但汽车现在即使在向上、向下、向左或向右时也只能行驶2.5(例如
[2.5,0]
)。
MAX_SPEED
值,以便我在这两次尝试之间有一个中间立场?
speed
参数,因此没有考虑新的
acceleration
和
angle
。我希望我能清楚地解释自己!请随意询问更多问题或获取代码片段:)
我假设每个刻度都会调用
add_acc_to_speed(speed, acceleration)
函数。为什么不尝试对以下方面施加限制:
new_speed = math.sqrt(((speed[0]+acceleration[0])**2 + (speed[1]+acceleration[1])**2))
,基本上就是
square_root(x_component^2 + y_component^2)
。这是汽车的实际速度,这将处理“我已经尝试过什么?”下的第 1 点和第 2 点。
如果添加加速度后该速度的值超过 5,则可以通过以下方式返回考虑角度后速度的 x 和 y 分量:
x_comp = float(format(math.cos(angle),".2f")) # ".2f" for 2 decimal places
y_comp = float(format(math.sin(angle),".2f"))
这些 x_comp 和 y_comp 值将是浮点值,最大速度为 5。您可以根据需要修改它们的类型。希望这有帮助!