如何使实体朝着x和y移动?

3

我希望找到一种方法,使我的实体(子弹)沿着x和y移动,这是当子弹被发射时玩家所在的位置。因此,在我的实体类中,我有 -

   float xSpeed = 1.0F;
   float ySpeed = 0.0F;

如果我想让实体在对角线上移动,我会将xSpeed和ySpeed设置为1.0F。 那么如何让它朝另一个x和y的方向移动呢?

感谢您的帮助 编辑 - 问题已解决,感谢您的帮助 对于其他需要帮助的人,这是我的代码 -

    float xSpeed = 0;
    float ySpeed = 0;

然后我需要进行一些数学计算,以使它们以相同的速度移动。
   ySpeed =  ySpeed * (float) (2.5 / Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed));
   xSpeed = xSpeed * (float) (2.5 / Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed));

使用以下代码设置xSpeed和ySpeed,基于您想移动向的x和y。

    xSpeed = (Game.PlayerX - x) / 3;
    ySpeed = (Game.Playery - y) / 3;

最后,将 xSpeed 和 ySpeed 加到实体的 x 和 y 上。

    this.x += xSpeed;
    this.y += ySpeed;
2个回答

7

通常的方法是设置相对于时间的x和y速度,以覆盖所需的x和y距离:

float xSpeed = (targetLocation.x - currentLocation.x) / travelTime;
float ySpeed = (targetLocation.y - currentLocation.y) / travelTime;

如果您想以预定速度旅行,而不是在预定的旅行时间内到达目的地,请按照上述计算方法将travelTime设置为某个任意值(1.0f即可),这样您就可以简单地省略除法。然后计算此因子:
float factor = desiredSpeed / Math.sqrt(xSpeed * xSpeed + ySpeed * ySpeed);

请注意,如果xSpeedySpeed都是0,则会除以零,但这只表示当前位置和目标位置相同。如果这是可能的情况,则应包括适当的检查。最后,通过以下因素重新调整xSpeedySpeed

xSpeed *= factor;
ySpeed *= factor;

请注意,将travelTime设置为1,只是一种聪明的方法,可以在不提及三角函数的情况下,通过正弦和余弦乘以旅行方向与x轴成角度来增加预设速度。 :)

完美运行,谢谢帮助 :D,所需速度可以是浮点数吗,因为2太慢了,3太快了:D。这是我在这个网站上的第一篇帖子,但肯定会再次使用,这是一个非常友好的社区。 - Jack Patrick
@JackPatrick - 我一直以为所有的都是浮点数。顺便欢迎加入社区。 - Ted Hopp
好的,谢谢你的帮助,我已经将解决方案添加到第一篇帖子中以帮助其他人。 - Jack Patrick
@JackPatrick - 如果这个回答解决了你的问题,请将其标记为已接受的答案。(有关接受答案的信息,请参见FAQ。) - Ted Hopp

0
你需要定义物体的速度和方向。然后,你可以使用简单的三角函数来确定每一步的x/y位移。
如果你使用当前的算法,你的物体将根据其方向改变速度,这可能不是你想要的。
线性方向: 速度x = 1 速度y = 0
总速度=1
对角线方向: 速度x = 1 速度y = 1
总速度=2
看到问题了吗?你的速度应该在任何方向下都是恒定的。
使用所谓的“向量”来描述你的物体的方向和速度。
类向量{ int x; int y; float angle; float magnitude; }
x、y、角度和大小描述了一个三角形。你想要的运动将是三角形斜边上的一点,由你的引擎使用的时间步长修改。
编辑-
想象一个半径为1单位的圆,它的原点在0,0处。

从原点向左侧画一条直线。你会得到一条长为1单位的线,它与圆在(1,0)相交。

现在,以45度角从原点向圆的边缘画一条直线。

你也会得到一条长度为1单位的线,但是线与圆相交的X/Y坐标将是(0.7,0.7),而不是(1,1)。

我没有IDE在身边,所以如果我的数学有误,请有人编辑,但我认为你需要这样做:

newPositionX = currentX + (cos(angle) * speed * timeStep)

newPositionY = currentY + (sin(angle) * speed * timeStep)


@TedHopp,应该是sqrt(2),这就是问题所在。根据Jack描述他的代码的方式,速度为2。也就是说,物体向左/右移动,然后在相同的时间框架内向上/下移动,而在另一个方向上,它只会向左/右移动。 - asawyer
更多的咖啡--我和你一起! - Ted Hopp
@TedHopp 这个公式看起来对吗?我有一段时间没做这种东西了。 - asawyer
我不确定您如何定义“角度”,但如果它是传统的方式,其中+x轴为零且正角度朝向+y轴移动,则需要在公式中颠倒“sin”和“cos”。 - Ted Hopp
@TedHopp 我也是这么想的。 - asawyer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接