gpt4 book ai didi

javascript - 二维宇宙飞船的封顶速度

转载 作者:行者123 更新时间:2023-11-28 10:18:02 26 4
gpt4 key购买 nike

因此,就像其他所有人都学习某种编程语言一样,我给自己做了一个太空飞船游戏项目。到目前为止,我拥有视差星以及我希望在太空飞船游戏中获得的所有美好事物。该船停留在游戏屏幕的中心,可以旋转360度,可以进行推力和滑行,并且通常表现得像太空中的物体一样。但是,我对限制船速有一个小问题。

该船具有dx和dy值(通过我的update()函数将其转换为恒星,因此它们可以实际移动),并根据其面对的角度在x轴或y轴上施加推力。我给船提供了最大速度(假设为5)和加速度(每帧0.1)。推力时,船会按照我的预期加速。由于我使用的是数字输入设备(箭头键),因此推进器始终处于100%状态,没有节气门控制。我检查了舰船当前dx和dy所形成的三角形的斜边以确定其当前速度,并跟踪了它的行进角度(用于以后的AI;武器开火;当我按下向下箭头时,船使用此值知道要旋转到与当前轨迹相反的角度,这是一种正确的“自动刹车”功能。

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

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),并且当我将方向更改几度时,船在经过几秒钟后就会朝该方向前进推力,当我面对和推力时,我希望船减速,就像人们期望的那样。

如果有人玩过《逃逸速度》游戏,那就是我正在努力的一种运动和控制系统-如果您愿意的话,就是我的“黄金标准”。

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

可以在 http://adrian.thomas-prestemon.com/game/v3/js/ships.js中找到处理此问题的特定.js文件。请原谅一堆注释掉的代码和东西。我一直在研究整个问题的这一特定方面已有一个星期。

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

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检查更加容易。

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

更新:

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

最佳答案

如果我将计算结果更改为move_angle,则在飞船起步但不移动时会遇到问题。


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

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

或者,您可以使大多数速度和加速度计算都在极值上进行操作,而只是在显示到屏幕时才转换为笛卡尔坐标。

抱歉,如果我不协调,那是我一天的低迷时期,我宁愿现在小睡,也不愿坐在办公桌前。

关于javascript - 二维宇宙飞船的封顶速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com