移动AI时如何考虑重力


9

我正在制作2D游戏。当前有一架直升飞机在飞行,由玩家控制。使用箭头键UP,LEFT和RIGHT进行控制。

沿y轴的速度为dy,而沿x轴的速度为dx

它的物理如下:

只要不按UP,就dy以恒定的加速度无限期地加速。(重力)。dx保持其当前值。

被按压UPdy加速在恒定加速度从不管它目前是,高达4(向上,直到它到达速度4)。dx保持其当前值。

按下左dx加速在不断加速,从不管它目前,达-4

RIGHT被按下,DX加速时在恒定加速度,无论从任何它目前是,高达4

(当我按下左键或右键而未同时按下UP 键时,我说过:dy由于重力影响直升机,它越来越小)

所有这些使直升机经常沿空中拱形而不是直线。

这产生了看起来很现实的物理学。

我的问题是:

敌方直升机,即AI,应使用相同的物理系统移动。

假设AI希望从当前位置到达B点。

在此处输入图片说明

如果游戏中没有重力且没有逐渐加速,那将很容易。我只需从AI的位置绘制一个向量到B点,然后让AI跟随它。

但是,由于存在重力和逐渐的加速度,所以AI永远无法(几乎)沿直线运动。使AI尽可能高效地到达B点的最佳方法是什么?

将AI移至特定目的地时,如何考虑重力?

(如果更容易解释,请考虑B点在y轴上与AI处于同一水平,而不是与之成对角线。)

谢谢


您可以在AI移动时禁用其物理功能吗?如果是这样,则可以在它接近该点时将其禁用,并在到达该点时启用。
Zhafur 2014年

@Zhafur这将使AI的运动看起来不切实际,或者至少与玩家的运动看起来有所不同。我希望AI的动作看起来与玩家的动作相同。
user3150201 2014年

Answers:


4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

与y相同。记住要限制速度,使其介于零和最大速度之间。如果敌人在某个时刻的速度非常慢并且试图停止,则它可能会开始朝相反的方向移动。请不要允许它。如果它正在减速并且其速度低于1 * Acc,则将其停止。

加长版:如果没有障碍物,则y轴上的移动与x轴上的移动完全无关(且不影响)。因此,您描述的问题可以分为两个独立的问题。

  1. 在x轴上移动
  2. 然后在y轴上移动。

CS.xCS.y是我们在x和y轴上的当前速度。

TS.xTS.y是考虑您当前在相关轴上的速度才能使您仅垂直或水平停止的时间。

D.xD.y是每个轴上的距离。

tl; dr:您将继续在x轴上加速(如果可能,[除非达到最高速度]),直到到达满足以下条件的位置:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

与y相同。


2

我用于类似问题的一种方法是首先将矢量绘制到目标,然后将其与当前速度方向进行比较。

因此,取速度矢量和目标矢量之间的正负角,并施加相对于矢量大小的推力。

因此,如果红色速度矢量和绿色目标矢量之间的角度a为负,则施加正推力,否则不施加推力,让重力对其进行分类。在此处输入图片说明

请注意,您必须对待目标可能有所不同的四个象限(就像目标位于左上角时,需要施加推力一样,为正角)。

另外,请确保施加相对于目标速度偏差的推力量。

从技术上讲,这并没有考虑重力,它是在补偿当前状态,这意味着AI直升机可能不会直线飞向目标,但会有些摇摆。这可能适用于您的游戏,也可能无效。


1
谢谢。关于此的几个问题:1- “ ...施加相对于向量大小的推力”。您是说角度大小”吗?2-用“符号角”表示正负-对吗?如果是这样,那么,如果角度在棕线上方,则角度为正;如果角度在棕线下方,则角度为负。对?3-如果我理解正确,您的意思是:每帧,获取当前速度矢量和目标矢量之间的夹角。然后相应地从dx和dy中减去。它是否正确?
user3150201 2014年

@ user3150201是的,关于角度的问题。是的,在有符号/无符号问题上,atan2可以为您提供两个向量之间的符号角。好像您了解我的意思,如果不清楚,我们深表歉意。
bornander

1

您可以简单地重新计算每X帧的运动。假设您没有在它们之间放置太多帧,但要足够多以至于不影响性能,那么直升机上的重力应该不足以真正看到轨迹的变化。另外,我认为玩家可能会以相同的方式移动,在移动时适应重力,而不需要计划。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.