我正在制作一个太空船的游戏,当按下左右键时它会旋转,当按下向上键时,它会向前移动。
目前,船舶可以在向前移动时旋转,但它将继续沿着它进入的方向继续。
我怎样才能使船在按下向上键的同时改变它的移动方向?
这是SpaceShip类的更新方法:
public void update(){
radians += ri;
System.out.println(radians);
if(radians < 0){
radians = 2 * Math.PI;
}if(radians > (2 * Math.PI)){
radians = 0;
}
x += xx;
y += yy;
}
这是正确的事件:
public void actionPerformed(ActionEvent e) {
if(pressed){
Board.getShip().setRI(0.05);
}else{
Board.getShip().setRI(0);
}
}
这就是up事件:
public void actionPerformed(ActionEvent e) {
if(pressed){
Board.getShip().setXX(Math.cos(Board.getShip().getRadians()) * Board.getShip().getSpeed());
Board.getShip().setYY(Math.sin(Board.getShip().getRadians()) * Board.getShip().getSpeed());
}else{
Board.getShip().setXX(0);
Board.getShip().setYY(0);
}
}
答案 0 :(得分:1)
<强>火箭强>
定义为
的火箭// pseudo code
rocket = {
mass : 1000,
position : { // world coordinate position
x : 0,
y : 0,
},
deltaPos : { // the change in position per frame
x : 0,
y : 0,
},
direction : 0, // where the front points in radians
thrust: 100, // the force applied by the rockets
velocity : ?, // this is calculated
}
移动的公式是
deltaVelocity = mass / thrust;
推力的方向是沿着船指向的方向。由于每帧的位置变化有两个组成部分,并且推力改变了增量,因此施加推力的方式是;
// deltaV could be a constant but I like to use mass so when I add stuff
// or upgrade rockets it has a better feel.
float deltaV = this.mass / this.thrust;
this.deltaPos.x += Math.sin(this.direction) * deltaV;
this.deltaPos.y += Math.cos(this.direction) * deltaV;
当推力增量添加到位置增量时,结果是船舶指向的加速度。
然后每帧用delta pos更新位置。
this.position.x += this.deltaPos.x;
this.position.y += this.deltaPos.y;
您可能需要添加一些阻力来减慢船舶的速度。您可以添加简单的阻力系数
rocket.drag = 0.99; // 1 no drag 0 100% drag as soon as you stop thrust the ship will stop.
应用拖动
this.deltaPos.x *= this.drag;
this.deltaPos.y *= this.drag;
获得当前的速度,虽然在计算中不需要。
this.velocity = Math.sqrt( this.deltaPos.x * this.deltaPos.x + this.deltaPos.y * this.deltaPos.y);
这将产生与游戏小行星相同的火箭行为。如果你想要的行为更像是船上的水或汽车(即改变方向改变了增量以匹配方向),请告诉我,因为这是对上述内容的简单修改。