我试图根据玩家手臂的旋转射击一个物体(一个咒语)。该法术应该从手中射出并射向鼠标所在的位置(手臂旋转并指向鼠标所在的位置)。这就是手臂在游戏中旋转的方式。
public boolean mouseMoved(int screenX, int screenY) {
tmp.x = screenX;
tmp.y = screenY;
tmp.z = 0;
cam.unproject(tmp);
rot = MathUtils.radiansToDegrees * MathUtils.atan2((float)tmp.y - (float)player.getArmSprite().getY() - player.getArmSprite().getHeight(),
tmp.x -player.getArmSprite().getX() - player.getArmSprite().getWidth());
if (rot < 0) rot += 360;
//Last right or left means if hes looking left or right
if(player.lastRight)
player.setObjectRotation(rot + 80);
if(player.lastLeft)
player.setObjectRotation(-rot - 80);
这就是法术应该根据轮换进行射击的方式
//destination is a vector of where on screen the mouse was clicked
if(position.y < destination.y){
position.y += vel.y * Gdx.graphics.getDeltaTime();
}
if(position.x < destination.x){
position.x += vel.x * Gdx.graphics.getDeltaTime();
}
然而,这是非常不稳定的,并且从未真正以一些例外的方式做出反应。它从手中射出,然后如果y轴相等则完全均匀,直到它到达x位置,我希望它从手发射到从a点到b点完全直接点击的位置,这很明显一个旋转问题,我似乎无法弄清楚如何解决。
以下是正在发生的事情的图像
红色表示我点击的位置,因为你可以看到它首先到达了x pos,现在正在到达y时它应该到达我首先点击的位置的x和y位置
非常感谢任何有关此问题的帮助!
答案 0 :(得分:1)
我对弧度和切线很不错但幸运的是我们有矢量。
因为你的手臂有rot
度。我建议现在使用矢量用于任何与矢量相关的数学。
//A vector pointing up
Vector2 direction = new Vector2(0, 1);
//Let's rotate that by the rotation of the arm
direction.rotate(rot);
现在方向是手臂指向的方向。如果您的rot
计算在up = 0
的位置。所以你可能需要将它旋转180度,90度或-90度。或者,如果你在某种程度上做了一些愚蠢的事情。
你的咒语也应该有一个Vector,因为它的位置。将其设置为手或您想要从哪里开始。现在您需要做的就是缩放direction
,因为它目前的长度为1.如果你想每帧移动5个单位,你可以direction.scl(5)
现在它的长度为5但从技术上讲,现在每个人都称它为velocity
所以没有方向,所以让我们这样做。
//when you need to fire
float speed = 5;
Vector2 velocity = direction.cpy().scl(speed);
//update
position.add(velocity);
draw(fireballImage, position.x, position.y);
我首先复制了方向,否则它也会被缩放。然后我只是将速度添加到位置并使用该矢量绘制。
要显示矢量很棒你应该看到我创建的这个真棒badlogic vs鼠标程序。 https://github.com/madmenyo/FollowMouse只有我自己代码的视图行。它只需要一点矢量知识,而且非常易读。