4

我有一艘敌舰和一艘玩家船。

我希望敌舰始终直线飞向玩家,即使玩家正在移动。

我将使用 C# XNA 的 Ray 类来解决这个问题。

我有两个矢量坐标,射线的位置/原点(玩家当前位置)和射线的方向(敌人的当前位置)。我希望敌人的位置逐渐向玩家位置移动。

到目前为止我有这个代码。

enemyPlayerTrack.Position = playerPos;
enemyPlayerTrack.Direction = enemyPos;

我不确定是否需要另一个矢量来表示速度。

最后,使用以下代码将敌人以新的位置绘制到屏幕上:

enemyWorldMatrix = Matrix.CreateTranslation(new Vector3(x, y, z));

如果没有数学背景,我很难创建一个速度来将两个向量连接得越来越近。

4

3 回答 3

2

我们选择一些速度s。那么玩家从敌人的方向是:

dir_x = player_x - enemy_x
dir_y = player_y - enemy_y

总速度 s = sqrt(vel_x^2 + vel_y)^2,所以我们缩放 dir 向量来给我们速度:

factor = s / sqrt(dir_x^2 + dir_y^2)
vel_x = dir_x * factor
vel_y = dir_y * factor

所以现在敌人将始终以相同的速度飞向玩家。但如果玩家靠近敌人,敌人会过冲并不断在玩家上方来回弹跳。所以我们限制速度:

distance = sqrt(dir_x^2 + dir_y^2)
delay_to_reaching_player = 2    // some measure of time
enemy_speed = min(s, distance/delay_to_reaching_player)

这样,通过设置延迟,敌人将在接近玩家时减速,一旦接近到足以停止以最大速度移动。

于 2012-10-11T10:01:16.717 回答
2

我面前没有 XNA,所以这只是伪代码......

两者之间的总增量应该很简单:

var delta = playerPosition - enemyPosition;

这给出了方向,但通常会有错误的幅度;所以我们可以通过以下方式将其重新缩放为单位向量:

var magnitude = Math.Sqrt(delta.x * delta.x + delta.y * delta.y +
                  delta.z * delta.z); // however many dimensions you have...
var unitDelta = delta / magnitude; // assuming non-zero; if zero, don't move
var newVelocity = unitDelta * enemySpeed;

但是请注意,这违背了动力,并且是非常基本的(它不考虑玩家的速度 - 感觉就像 AI 很愚蠢)。

于 2012-10-11T10:04:50.727 回答
0

如果你有一个来自敌人 -> 玩家的向量,你基本上有一个翻译,你可以将它应用到敌人上,让它跳到玩家的位置。您需要通过归一化向量来返回“单位”,这会将向量的总长度设置为“1”,但仍然指向玩家的方向,然后您可以将此值乘以您实际想要的速度获取一个向量来平移敌人,将其移向玩家

正如人们已经回答的那样 - 要获得一个单位,您需要将向量的两个分量的乘积相加,然后取平方根。这与毕达哥拉斯定理有关,例如:

如果你把向量的分量说

(2,2)

这将是这样的:

  2 
  ^
  |
  |
--> 2

然后在原点 (0,0) 和向量末端相交的点之间画一条线 - 你会得到一个三角形......

  2
  ^
 /|
/ |
--> 2

这条线代表向量的大小,你取两个分量的平方和,然后对它进行sqrt 得到这条线的长度:

2 * 2 + 2 * 2 = 8

sqrt(8) = 2.82

所以这个向量的长度是 2.82 - 这意味着 2 和 2 的值是单个单位向量大小的 2.82 倍

要获得“1”长或“单位”的分量,我们需要对向量进行归一化——我们通过将每个分量除以幅度来实现

2 / 2.82 = 0.70

听起来是对的 - 我知道这个向量的角度是 45 度(向上 2 到 2 必须是完美的对角线)所以你可以使用余弦或正弦来检查它,因为余弦/正弦提供了向量分量的水平或垂直单位长度对于给定的角度

sin(45) or cos(45) = 0.70

发现

所以现在你知道了朝向玩家的角度使用了一个长度为 1 的向量,其中包含以下分量

(0.7, 0.7)

要将敌人向玩家移动 3 个单位,您只需将组件乘以 3

0.7 * 3 = 2.1

所以

(2.1, 2.1)

在这个物理步骤中将敌人向玩家移动 3 个单位

这有帮助吗?

于 2012-10-11T10:25:12.353 回答