Java 根据玩家位置旋转纹理

Java 根据玩家位置旋转纹理,java,libgdx,Java,Libgdx,我正在制作一个2d游戏,其中包括一架飞机通过导弹与宇宙飞船作战,我希望宇宙飞船根据玩家的位置旋转,这样它们总是面对着有“头”的玩家。玩家可以在y和x方向自由移动。 玩家和宇宙飞船有一个Vector2 pos变量,对应于他们的实际位置。 任何帮助都将不胜感激 这是我的(正在工作)代码: 敌方宇宙飞船旋转,但它们并不总是面对玩家: 我认为这应该行得通。设置 v = centerPosOfShip - centerPosOfUFO 正常化 v /= sqrt( v.x * v.x + v.y * v

我正在制作一个2d游戏,其中包括一架飞机通过导弹与宇宙飞船作战,我希望宇宙飞船根据玩家的位置旋转,这样它们总是面对着有“头”的玩家。玩家可以在y和x方向自由移动。 玩家和宇宙飞船有一个Vector2 pos变量,对应于他们的实际位置。 任何帮助都将不胜感激

这是我的(正在工作)代码:

敌方宇宙飞船旋转,但它们并不总是面对玩家:

我认为这应该行得通。设置

v = centerPosOfShip - centerPosOfUFO
正常化

v /= sqrt( v.x * v.x + v.y * v.y )
现在我们可以说v=[cos(θ)sin(θ)];旋转矩阵是

[ cos(theta)  -sin(theta) ]
[ sin(theta)   cos(theta) ]
所以我们可以用v分量来写

[ v.x  -v.y    centerPosOfUFO.x ][x]
[ v.y   v.x    centerPosOfUFO.y ][y]
[ 0     0      1                ][1]
其中[xy]是UFO上相对于其中心的任何点


希望这是有意义的,@dwn的答案在数学上是正确的,但在处理LibGDX框架时,最好使用本机工具

如果你有敌人和玩家的位置存储在向量2中,那么你可以方便地进行计算。 例如,要确定特定敌人和玩家之间的角度:

Vector2 enemyPos;
Vector2 playerPos;
Vector2 temp;

float angle = temp
                .set(playerPos)
                .sub(enemyPos)
                .angle();
这会给你你想要的。当然,最好将
temp
向量保留在公共空间的某个地方,以便在如此众多的计算中使用它。你最好检查一下其他方便的
Vector2
方法,这将大大简化你的生活


祝你好运。

我应该如何应用角度来进行旋转?首先,不要在每次render()调用中实例化Sprite。创建一次,并分别为游戏中的每个单位保存。可以对每个精灵应用一些变换参数。像旋转,缩放。。。然后,只需调用Sprite.draw(sb)好吧,我实际上没有使用精灵,每个实体都有一个矢量2位置和一个纹理,有没有办法不使用精灵就可以做到这一点?当然。检查最长SpriteBatch#draw(纹理…)方法,它有旋转参数。是的,现在它根据玩家位置旋转,唯一的问题是我必须向旋转添加90度,因为我的原始纹理指向下方,它应该指向右侧。谢谢
Vector2 enemyPos;
Vector2 playerPos;
Vector2 temp;

float angle = temp
                .set(playerPos)
                .sub(enemyPos)
                .angle();