这几天我一直在尝试,但基本上我有一些生物和玩家在屏幕上。我想要发生的是让敌人以可变速度转向面对玩家,而不是“锁定”到位并立即面对玩家。
我正在尝试做的是计算给定敌人顺时针或逆时针旋转面对玩家是否更快,但事实证明这超出了我的三角学能力。
例子:
这些图中的
x
代表“较短”的路径以及我在每种情况下要旋转的方向。
在这种情况下,使用以下任何一种方法来计算“顺时针”或“逆时针”的最简单方法是什么:
- 敌人面对的方向。
- 敌人与玩家之间的角度,以及玩家与敌人之间的角度。
最佳答案
这里不需要计算角度或使用三角函数,假设你有一个方向向量。
var pos_x, pos_y, dir_x, dir_y, target_x, target_y;
if ((pos_x - target_x) * dir_y > (pos_y - target_y) * dir_x) {
// Target lies clockwise
} else {
// Target lies anticlockwise
}
这只是在对象面向的方向上绘制一条穿过对象的假想线,并确定目标在该线的哪一侧。这是基本的线性代数,所以你不需要在这个函数的任何地方使用 sin()
或 cos()
等,除非你需要计算方向向量角度。
这也使用右手坐标系,如果您使用左手坐标系,它将向后 - 公式将相同,但“顺时针”和“逆时针”将互换。
更深层次的解释:函数计算前向向量(dir_x, dir_y)
和到目标的向量的外积,(target_x - pos_x, target_y - pos_y)
。生成的外积是一个正或负的伪标量,取决于目标是顺时针还是逆时针。
向量速成类(class)
矢量是幅度和方向,例如,向北 3 公里或向下 6 厘米。您可以使用笛卡尔坐标 (x, y) 来表示矢量,也可以使用极坐标 (r,θ) 来表示它。两种表示都为您提供相同 向量,但它们使用不同的数字和不同的公式。一般来说,您应该坚持使用笛卡尔坐标而不是极坐标。如果您正在编写游戏,极坐标非常糟糕——它们在您的代码中到处都是 sin()
和 cos()
。
代码中有三个向量:
向量
(pos_x, pos_y)
是物体相对于原点的位置。向量
(target_x, target_y)
是目标相对于原点的位置。向量
(dir_x, dir_y)
是物体面对的方向。
关于actionscript-3 - 如何确定面对顺时针或逆时针旋转的物体是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14807287/