Mar*_*rty 3 math trigonometry actionscript-3
我已经尝试了几天无效,但基本上我有一些生物和屏幕上的播放器.我想要发生的是让敌人转向以可变速度面对玩家,而不是"锁定"到位并立即面对玩家.
我想要做的是弄清楚一个特定的敌人是否更快地顺时针或逆时针旋转以面向玩家,但事实证明它超出了我的三角学能力.
例:

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
}
Run Code Online (Sandbox Code Playgroud)
这只是在物体朝向的方向上绘制一条虚线穿过物体,并找出目标所在线的哪一侧.这是基本的线性代数,因此您不需要在此函数的任何位置使用sin()或cos()等,除非您需要从角度计算方向向量.
这也使用右手坐标系,如果使用左手坐标系,它将向后 - 公式将相同,但"顺时针"和"逆时针"将被交换.
更深入的解释:该函数计算前向矢量的外积(dir_x, dir_y)和目标的矢量(target_x - pos_x, target_y - pos_y).得到的外积是假标量,其是正的或负的,取决于靶是顺时针还是逆时针.
矢量是幅度和方向,例如,向北3公里或向下6厘米.您可以使用笛卡尔坐标(x,y)表示矢量,也可以使用极坐标(r,θ)表示矢量.两种表示都为您提供相同的向量,但它们使用不同的数字和不同的公式.一般来说,你应该坚持使用笛卡尔坐标而不是极坐标.如果你正在编写一个游戏,极坐标吸庄严-他们垃圾你的代码sin()和cos()无处不在.
代码中有三个向量:
向量(pos_x, pos_y)是对象相对于原点的位置.
向量(target_x, target_y)是目标相对于原点的位置.
向量(dir_x, dir_y)是对象面向的方向.