我目前正在用Java创建2D太空游戏,您可以在其中控制太空中的飞船。游戏不使用任何外部库。
该船应该朝着光标移动。但是,在移动光标时,旧的作用力不会神奇地消失;随着时间的流逝,船会改变航向,最终朝着期望的方向移动。
但是,我遇到了有关船舶运动的问题。基本上,此图像粗略地说明了我想要实现的目标:
该图显示了该船在一个游戏滴答声中应该如何运动。进一步说明:
圆圈显示了船的最大速度。
目标角度是光标当前所在的位置。
当前角度是船舶当前行驶的方向。
当前角度应越来越接近目标角度,直到达到两个角度相同的点。
船舶应采用尽可能短的路线将方向转向目标角度;它可以左右旋转,而不仅仅是左右旋转。
现在,我已经解释了我想要实现的目标,现在我将描述到目前为止我已经实现的目标以及它是如何工作的。
基本上,“船”是位于屏幕中央的图像。当您“移动”船时,船会保持原状。剩下的是游乐区。
船舶相对于代表游戏区域的坐标系的当前“位置”是整数xPos和yPos。
现在获取一些示例代码,这些代码显示了系统的工作方式:
int xPos;
int yPos;
public void updateMovement() {
xPos += xSpeed;
yPos += ySpeed;
}
public void moveForward() {
double yTempSpeed = ySpeed;
double xTempSpeed = xSpeed;
yTempSpeed += 0.01 * Math.sin(Math.toRadians(targetAngle));
xTempSpeed += 0.01 * Math.cos(Math.toRadians(targetAngle));
double resultVector = Math.sqrt(xTempSpeed * xTempSpeed + yTempSpeed * yTempSpeed);
if (resultVector < 2) {
ySpeed += 0.01 * Math.sin(Math.toRadians(targetAngle));
xSpeed += 0.01 * Math.cos(Math.toRadians(targetAngle));
}
该代码成功地将轮船的最大速度设置为所需的值,但是,如果结果“矢量”大于2,即当速度已经达到其最大速度时,此功能将不起作用(轮船的航向不会改变)。最大值和targetAngle太接近船舶当前行驶的角度(+-Pi / 2)。
我将如何基于此实现来更改当前角度?
public void moveForward() {
ySpeed += 0.01 * Math.sin(Math.toRadians(targetAngle));
xSpeed += 0.01 * Math.cos(Math.toRadians(targetAngle));
double currentSpeed = Math.sqrt(xTempSpeed * xTempSpeed + yTempSpeed * yTempSpeed);
if (currentSpeed > maxSpeed) {
//the resulting speed is allways <= maxspeed (normed to that)
ySpeed *= maxSpeed/currentSpeed;
xSpeed *= maxSpeed/currentSpeed;
}
希望这是您所需要的...尽管这是不现实的,但太空飞船具有最大速度,但就“可玩性”而言,我会这样做。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句