2016-01-02 76 views
0

我正在製作一個遊戲,當一個太空飛船在按下左鍵和右鍵時旋轉,當按下上鍵時向前移動。在移動的同時改變方向

目前該船可以在其前進的旋轉,但它會繼續在同一方向,它是在準備。

我將如何讓這個船可以改變它,同時向上移動的方向關鍵是被壓制?

這是飛船類的更新方法:

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

,這是向上事件:

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

設置一個標誌,確定哪個鍵或方向處於活動狀態。在主「遊戲循環」中檢查標誌並應用相應的增量 – MadProgrammer

+0

類似[this](http://stackoverflow.com/questions/22748547/java-swing-timer-only-works-once-then-keyevents- fire-in-rapid-succession-holdi/22749251#22749251)或[this](http://stackoverflow.com/questions/16622630/gradually-speeding-a-sprite/16623202#16623202)或[this](http: //堆棧溢出。com/questions/34125578 /逐漸加速 - 精靈按鍵 - 逐漸減速 - 按鍵釋放/ 34126260) – MadProgrammer

+0

和[類似於[this](http://stackoverflow.com/questions/) 13041297/java-moving-an-object-at-an-angle-and-changing-angle-with-keypress/13041547#13041547)應該允許您基於角度和要應用的增量計算x/y點 – MadProgrammer

回答

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,結果是船的方向上的加速度。

然後,您通過增量位置更新位置。

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; 

爲了獲得當前的速度,雖然在caculations沒有必要的。

this.velocity = Math.sqrt(this.deltaPos.x * this.deltaPos.x + this.deltaPos.y * this.deltaPos.y); 

這會產生與遊戲中的小行星相同的火箭行爲。如果你想要的行爲更像是一條船上的水或汽車(即改變方向改變三角洲以匹配方向)讓我知道,因爲它是對上述的簡單修改。