二维太空飞船的上限速度

时间:2011-05-26 19:43:57

标签: javascript game-physics acceleration

就像其他人学习一些编程语言一样,我给自己一个太空飞船游戏项目。到目前为止,我拥有视差星和我期望从宇宙飞船游戏中获得的所有美好的东西。船停留在游戏屏幕的中心,可以旋转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 Q& As以及:

2D Spaceship movement math

2d trajectory planning of a spaceship with physics

Programming a smooth change of thrust from current velocity vector to a target vector

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

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

感谢您抽出宝贵时间阅读所有这些内容。 :)

更新:

我对我的代码进行了一些修改,并且它比以前更好地工作了。它并不完美,但应该采取一些更多的实验,调整和调试。 :)

1 个答案:

答案 0 :(得分:0)

  

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

将您的dxdyx_speedy_speed值初始化为0,并让x_speedy_speed值确定移动角度而不是将move_angle分开。

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

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

对不起,如果我是半语无伦次的话,这对我来说是昙花一现的时间,我现在宁可小睡,也不愿坐在办公桌前。