就像其他人学习一些编程语言一样,我给自己一个太空飞船游戏项目。到目前为止,我拥有视差星和我期望从宇宙飞船游戏中获得的所有美好的东西。船停留在游戏屏幕的中心,可以旋转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 trajectory planning of a spaceship with physics
Programming a smooth change of thrust from current velocity vector to a target vector
所有这些解决方案看起来都非常棒,但对于我的目的而言,它们似乎都有点复杂。我不打算实施任何类型的重力系统,如第一个例子所示,而另外两个,虽然相关,似乎没有提供任何直接用于我的具体问题。
任何人都可以提供的任何基本伪代码和/或其他类型的帮助 - 例如直接指向我回答我的问题的其他内容,我可能已经错过了 - 将不胜感激。我正在寻找适用于我当前设置的解决方案,但我绝对愿意改变我的船舶运动代码的一些功能,如果它可以使这个max_speed检查更容易。
感谢您抽出宝贵时间阅读所有这些内容。 :)
更新:
我对我的代码进行了一些修改,并且它比以前更好地工作了。它并不完美,但应该采取一些更多的实验,调整和调试。 :)
答案 0 :(得分:0)
如果我将该计算更改为move_angle,那么当船舶开始运行时,我会遇到问题而不会移动。
将您的dx
,dy
,x_speed
和y_speed
值初始化为0,并让x_speed
和y_speed
值确定移动角度而不是将move_angle
分开。
或者,如果我误解了您的设置,只需从speed
设置为0开始,并在速度值低于某个截止值时进行不涉及三角函数的计算。
或者您可以让大多数速度和加速度计算在极值上运行,并在显示到屏幕时转换为笛卡尔坐标。
对不起,如果我是半语无伦次的话,这对我来说是昙花一现的时间,我现在宁可小睡,也不愿坐在办公桌前。