我正在创建一个小型的太空射击游戏。然而,我遇到了一个数学问题,涉及到太空物理。
用话来描述就是:
有一个最大速度。 因此,如果你给船以全速,它将像旧版的飞碟游戏一样在屏幕上来回移动。 如果释放火箭助推器,你的船应该保持这个速度继续在屏幕上移动。
接下来是我现在卡住的棘手部分:
如果你把船旋转到任意角度,并再次给予加速力,那么船应该试图朝这个方向移动,并且永远不要超过最大速度。所以我的问题是,有没有一个好的公式可以解决这个问题?如果你知道该找什么,感觉好像已经有人做过了。:)
我会添加这张小图片来说明需要进行一些矢量计算的事情。
红色圆环:最大速度
绿线:当前船的方向。
黑线:方向(s) 和船在x和y方向上移动的速度。
黑色圆环:移动的起点。
可以说明这个问题,但是很难找到一个好的数学解决方案。:)
编辑
这是我现在在每个帧中使用的代码。它给船以运动,但不会给出运动力,用户必须用火箭助推器来对抗并停止或减慢船的速度。因此,当你释放加速船的速度时,它会立即停止。
//Calculates ship movement rules
var shipVelocityVec = GetVectorPosByAngle(shipMoveSpeed, shipRotationAngle);
var shipUnitVec =$V([Math.cos(shipRotationAngle),Math.sin(shipRotationAngle),0]);
var rawAccel = shipAccelSpeed / shipMass;
var scale = (shipUnitVec.dot(shipVelocityVec))/(shipTopSpeed * shipTopSpeed);
var v1 = shipUnitVec.subtract(shipVelocityVec.multiply(scale));
var finalAccelVec = v1.multiply(rawAccel);
console.log(finalAccelVec);
//move ship according to rules
var shipPosVector = $V([shipxPos, shipyPos, 0]);
var movementVector = shipPosVector.add(finalAccelVec);
shipxPos = movementVector.elements[0];
shipyPos = movementVector.elements[1];
用户需要按住按钮才能提供加速度。一旦用户松开按钮,加速度就会归零,再次启动时需要重新施加最大加速度油门。 问题解决! 我在这里发布了如何解决的方法。