2015-10-26 88 views
1

所以我想在java中構建一個自上而下的太空射擊遊戲。對象旋轉和當前面向方向的移動; Java

我相當新,但我對它的完善使pong有很好的把握。我的主要問題是我似乎無法旋轉。

我希望能夠在箭頭鍵上按右或左,並有一個基本的矩形,圍繞其中心在用戶輸入的方向旋轉。

一旦我有了這個,我希望能夠向前或向後按箭頭鍵,使其沿目前所面臨的方向前進。

我迄今試過的所有東西都會影響框架中的所有內容,而不僅僅是單個對象。來自as2,旋轉和對象在java中是非常不同的。

有人可以幫我解釋一下我會怎麼做?

package spaceroyalgame; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Rectangle; 
import java.awt.RenderingHints; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.geom.AffineTransform; 



public class SpaceRoyalGame extends JPanel implements KeyListener { 
     static double shipRotation=0, shipRotationSpeed=0, shipSpeed=0, TOPSPEED= 20; 

     static int shipy=50, shipx=50, shipWidth = 10, shipHeight = 20; 
     static int WorldWidth = 700, WorldHeight = 700; 
     static boolean slowdown = true; 

    public static void main(String[] args) throws InterruptedException { 
     SpaceRoyalGame game = new SpaceRoyalGame(); 

     JFrame frame = new JFrame(); 
     frame.add(game); 
     frame.setSize(WorldWidth,WorldHeight); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addKeyListener(game); 


     while(true){ 
      game.moveShip(); 

      game.repaint(); 

      Thread.sleep(10); 
     } 

    } 



    public void moveShip(){ 
     if (shipSpeed != 0) { 
      shipx += shipSpeed; 
     } 
     if (shipRotationSpeed != 0) { 
      shipRotation += shipRotationSpeed; 
     } 
    } 


    public void paint (Graphics g){ 
     super.paint(g); 
     setBackground(Color.black); 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g.setColor(Color.white); 
     Rectangle ship = new Rectangle(shipx,shipy,100,50); 

     g2d.rotate(Math.toRadians(shipRotation)); 
     g2d.draw(ship); 
     g2d.fill(ship); 


    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     int keyCode = e.getKeyCode(); 
     slowdown = false; 

     if (keyCode == KeyEvent.VK_W) { 
      //System.out.println("W is pressed"); 
      shipSpeed = -2; 

     } 
     if (keyCode == KeyEvent.VK_S) { 
      //System.out.println("S is pressed"); 
      shipSpeed = 2; 
     } 
     if (keyCode == KeyEvent.VK_A) { 
      System.out.println("A is pressed"); 
      shipRotationSpeed = 1; 
      shipRotation += shipRotationSpeed * (shipSpeed/TOPSPEED); 

     } 
     if (keyCode == KeyEvent.VK_D) { 
      System.out.println("D is pressed"); 
      shipRotationSpeed = -1; 
      shipRotation += shipRotationSpeed * (shipSpeed/TOPSPEED); 

     } 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     shipRotationSpeed = 0; 

     shipSpeed = 0; 

    } 

} 
+0

你的代碼在哪裏?我們不介意讀者。 – redFIVE

+0

對不起,我的代碼是一個從測試混亂,我不得不清理它之前,我可以發佈@redFIVE –

回答

0

嘗試使用Vectors。由於'A'和'D'鍵正在修改當前角度,所以您應該保留一個變量以跟蹤角度。

從那裏:

x += speed * cos(θ) 
y += speed * sin(θ) 

此外,如果你希望能夠加速/減速:

Δx = speed * cos(θ) * Δt + 1/2 * acceleration * Δt^2 
Δy = speed * * sin(θ) * Δt + 1/2 * acceleration * Δt^2 

Δt的將是最後一幀之間的時間。

它可能是值得一看Physics/Kinematics

+0

Im與物理等家庭,我只是不知道如何將它應用於代碼對象 –

+0

如果你有一個很好的把握在物理學上,你應該聽說過參數方程。因爲你正在研究一個笛卡兒x,y圖,你可以通過對數操作來「應用它的代碼」。是否有一個特定的部分被卡住? –