因此,就像其他学习某种编程语言的人一样,我给了自己一个太空飞船游戏项目。到目前为止,我拥有视差星以及我对太空飞船游戏所期望的所有美好事物。该船位于游戏屏幕的中心,可以旋转 360 度,可以推力和滑行,并且通常表现得像外太空中的物体一样。但是,我在限制船速方面遇到了一个小问题。
该船有一个 dx 和 dy 值(它通过我的 update()函数将其转换为当前的箭头,以帮助您正确地将其转换为恒星;因此它们进行实际移动),并根据它所面对的角度在 x 或 y 轴上施加推力。我给船一个最大速度(假设为 5)和一个加速度(每帧 0.1)。当推力时,船的加速度始终是 100 %,没有使用数字箭头控制,
船上有这些变量,在必要时更新(这是一个简短的列表,因为其余的东西不直接相关):
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)
我使用这个函数检查我的 dx 和 dy 的加速度基于 face_angle:
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.tmas-prestemon.com/game/v3/查看我当前有点工作的代码
处理这个的具体.js 文件可以在http://adrian.tmas-prestemon.com/game/v3/js/ships.js找到。请原谅乱七八糟的注释掉的代码和东西。我已经在这个特定的整体问题上工作了一个星期了。
我已经检查了在线提供的多个其他解决方案,并且与我的设计最相似的解决方案使用了我上面提供的第一个“if”示例,这对我不起作用。
2D Spaceship movement math 2d trajectory planning of a eship with physics Programming a smooth change of thrust from current velocity vector to a target vector所有这些解决方案似乎都非常棒,但对于我的目的来说,它们似乎都有点复杂。我不打算像第一个例子那样实施任何类型的重力系统,而其他两个虽然相关,但似乎并没有为我的具体问题提供任何直接使用的东西。
任何人都可以提供任何基本的伪代码和 / 或其他类型的帮助-例如直接指向我回答我的问题的其他东西,我可能已经错过了-将不胜感激。
感谢您抽出时间阅读所有这些内容。:)
更新:
我已经对我的代码做了一些修改,我得到了它的工作比它曾经做的更好。它并不完美,但更多的实验,调整和调试是它应该采取的。:)
如果我将计算更改为 move_angle,那么当船开始时,我遇到问题,而不是移动。
将dx
、dy
、x_speed
和y_speed
值初始化为 0,并让x_speed
和y_speed
值确定移动角度,而不是将move_angle
分开。
或者,如果我误解了你的设置,只需将speed
设置为 0,并在速度值低于某个截止值时进行不涉及三角学的计算。
或者,您可以让大多数速度和加速度计算在极坐标值上运行,并在显示到屏幕时转换为笛卡尔坐标。
抱歉,如果我语无伦次,那对我来说是一天中最糟糕的时候,我宁愿现在小睡一会儿,也不愿坐在办公桌前。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(12条)