1

所以就像其他学习编程语言的人一样,我给自己做了一个宇宙飞船游戏项目。到目前为止,我已经拥有了视差星以及我对宇宙飞船游戏所期待的所有美好事物。这艘船停留在游戏画面的中央,可以 360 度旋转,可以推力和滑行,并且通常像外太空中的物体一样正常运行。但是,我遇到了一个小问题,即限制船速。

这艘船有一个 dx 和 dy 值(它通过我的 update() 函数将其转换为星星,因此它们进行实际移动),它根据它所面对的角度在 x 或 y 轴上施加推力。我给船一个最大速度(比如说5)和一个加速度(每帧0.1)。推进时,船会像我预期的那样加速。推进器始终处于 100% 状态,没有油门控制,因为我使用的是数字输入设备(箭头键)。我检查由船的当前 dx 和 dy 组成的三角形的斜边以确定它的当前速度,我还跟踪它的行进角度(用于以后的 AI;武器开火;当我按下向下箭头时, ship 使用这个值来知道它需要旋转到什么角度才能面对它当前的轨迹——一种帮助你正确刹车的自动驾驶仪)。

这艘船有这些变量,这些变量会在必要时更新(这是一个简短的列表,因为其余的东西并不直接相关):

x_speed
y_speed
speed
move_angle // Used to track direction of motion
face_angle // Used to determine x_accel and y_accel when thrusting
x_accel
y_accel
accel = 0.1 // Used to determine x_accel and y_accel by multiplying by the dx and dy returned by getDxDy(face_angle)
max_x
max_y
max_speed = 5 // Used to determine max_x and max_y by multiplying by the dx and dy returned by getDxDy(face_angle)

我使用这个函数根据 face_angle 检查我的 dx 和 dy 的加速度:

function getDxDy(degree)
{
var dx;
var dy;
var degree = degree;

dx = -Math.sin(degToRad(degree));
dy = Math.cos(degToRad(degree));

var dxdy = {
    dx: dx,
    dy: dy
};

return dxdy;
}

我像这样更新每一帧加速度的速度:

x_speed += x_accel
y_speed += y_accel

我已经尝试使用多种不同类型的检查来限制速度,并且我已经尝试过:

if (x_speed > max_x)
{
    x_speed = max_x
}

我试过这个:

if (x_speed > max_x)
{
    x_speed -= x_accel
}

第一个版本根据需要限制了速度,但是我要么完全无法进一步修改我的加速度,要么当我试图通过面向相反方向并推进来反转航向时,我的速度立即跳到相反方向的 max_speed(因为 max_speed是根据船舶当前的 face_angle 不断计算的)。如果我将该计算更改为 move_angle,那么当船开始并且不移动时我会遇到问题。

如果我碰巧在速度回到阈值以下之前停止推进,第二个版本就会出现问题;我转身和推力,相反,我的推力是负的,这导致我在我行进的方向上加速得更远,与我所面对的方向完全相反。

理想情况下,我希望能够将推力限制在任何方向的某个值(例如 5),并且当我将方向改变几度时,船会在几秒钟后朝那个方向行驶推力,当我转身和推力时,我希望船像预期的那样减速。

如果有人玩过 Escape Velocity 游戏,那就是我正在努力实现的那种运动和控制系统——如果你愿意的话,这就是我的“黄金标准”。

在http://adrian.thomas-prestemon.com/game/v3/上查看我当前的工作代码

可以在http://adrian.thomas-prestemon.com/game/v3/js/ships.js找到处理此问题的特定 .js 文件。请原谅注释掉的代码和东西的混乱。一个星期以来,我一直在研究这个整体问题的特定部分。

我已经检查了其他多种在线可用的解决方案,与我的设计最相似的解决方案使用了我上面提供的第一个“if”示例,这对我不起作用。我还查看了以下 StackOverflow 问答:

2D 宇宙飞船运动数学

宇宙飞船的二维轨迹规划与物理

对推力从当前速度矢量到目标矢量的平滑变化进行编程

所有这些解决方案看起来都非常棒,但对于我的目的来说,它们似乎都有点复杂。我不打算像第一个示例那样实施任何类型的重力系统,而另外两个虽然相关,但似乎没有为我的具体问题提供任何直接有用的东西。

任何人都可以提供的任何基本伪代码和/或其他类型的帮助——例如直接向我指出可以回答我的问题的其他东西,我可能错过了——将不胜感激。我正在寻找适用于我当前设置的解决方案,但我绝对愿意稍微改变我的船的运动代码的功能,如果它能让这个 max_speed 检查更容易。

感谢您花时间阅读所有这些内容。:)

更新:

我已经对我的代码进行了一些修改,并且我的工作比以前好得多。它并不完美,但需要更多的实验、调整和调试。:)

4

1 回答 1

0

如果我将该计算更改为 move_angle,那么当船开始并且不移动时我会遇到问题。

dx将、dyx_speed和值初始化y_speed为 0,并让x_speedy_speed值确定移动角度,而不是保持move_angle分开。

或者,如果我误解了您的设置,只需从speed设置为 0 开始,然后在速度值低于某个截止值时进行不涉及三角函数的计算。

或者,您可以让大多数速度和加速度计算在极坐标值上进行,并在需要显示到屏幕时转换为笛卡尔坐标。

抱歉,如果我语无伦次,这对我来说是一天中的低迷期,我宁愿现在打个盹也不愿坐在办公桌前。

于 2011-05-26T19:51:57.507 回答