移动时改变方向

时间:2016-01-02 21:35:04

标签: java events game-physics key-bindings

我正在制作一个太空船的游戏,当按下左右键时它会旋转,当按下向上键时,它会向前移动。

目前,船舶可以在向前移动时旋转,但它将继续沿着它进入的方向继续。

我怎样才能使船在按下向上键的同时改变它的移动方向?

这是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);
    }
}

1 个答案:

答案 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);

这将产生与游戏小行星相同的火箭行为。如果你想要的行为更像是船上的水或汽车(即改变方向改变了增量以匹配方向),请告诉我,因为这是对上述内容的简单修改。