如何限制具有 max_speed 值的汽车的 X 和 Y 偏移,同时考虑其角度?

问题描述 投票:0回答:1

背景:

我有一个游戏,我可以在自上而下的视图中控制汽车。我使用多个变量来移动它。

  • 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

我希望我能清楚地解释自己!请随意询问更多问题或获取代码片段:)

python pygame trigonometry angle
1个回答
0
投票
注意:这不是一个全面的答案。它的目的是帮助您找出问题所在,因为我需要更多的上下文(和时间:p)才能给出准确的答案。

我假设每个刻度都会调用

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。您可以根据需要修改它们的类型。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.