2013-02-27 72 views
2

嗨,我剛剛搞過關於多邊形和awt。我創建了一個Jframe,並可以繪製多邊形,並讓其中一個按鍵移動。創建遊戲循環線程

我想知道如何啓動一個gameloop線程(以及放在哪!),它將獨立更新jframe。

從谷歌搜索引擎認爲我應該有一個用戶輸入線程和一個遊戲本身。

目前我已經在板類上實現了KeyListener(代碼如下所示),我應該把它放到它自己的類中並讓它實現可運行嗎?如代碼所示,我在keypressed()方法中重新繪製JFrame只是所以我可以看到它正確移動

在這一天的大部分時間,我有我自己非常困惑:) 一如既往的任何幫助非常感謝!

此外,雖然即時從它在線tutourials我應該使用JPanel而不是JFrame和paintComponent()而不是paint()?

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.awt.geom.AffineTransform; 

import javax.swing.JFrame; 

public class Board extends JFrame implements KeyListener{ 
    AffineTransform identity = new AffineTransform(); 
    Graphics2D g2d; 

    Ship ship = new Ship(); 

    public static final int ALIENS = 3; 
    Alien[] alien = new Alien[ALIENS]; 


    Board(){ 
     super("The Board"); 
     setSize(1280,1024); 
     setVisible(true); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     getContentPane().setBackground(Color.BLACK); 
     for(int x=0;x<ALIENS;x++){ 
      alien[x]=new Alien(); 
     } 
    } 

    public void paint(Graphics g){ 
     super.paint(g); 
     addKeyListener(this); 
     //draw ship 
     g2d = (Graphics2D)g;  
     g2d.setTransform(identity); 
     g2d.translate(ship.getxPos(),ship.getyPos()); 
     g2d.scale(2,2); 
     g2d.setColor(Color.ORANGE); 
     g2d.fill(ship.getShape()); 
     g2d.setColor(Color.BLACK); 
     g2d.draw(ship.getShape()); 

     // draw aliens 
     for(int x=0;x<ALIENS;x++){ 
      //if alien alive 
      if(alien[x].isAlive()){ 
       //draw alien 
       g2d = (Graphics2D)g;  
       g2d.setTransform(identity); 
       g2d.translate(alien[x].getxPos(),alien[x].getyPos()); 
       g2d.scale(2,2); 
       g2d.setColor(Color.BLUE); 
       g2d.fill(alien[x].getShape()); 
       g2d.setColor(Color.BLACK); 
       g2d.draw(alien[x].getShape()); 
      } 
     } 
    }//end paint 


    /***************************************************** 
    * key listener events 
    *****************************************************/ 
    public void keyReleased(KeyEvent k) { } 
    public void keyTyped(KeyEvent k) { } 
    public void keyPressed(KeyEvent k) { 
     int keyCode = k.getKeyCode(); 

     switch (keyCode) { 

     case KeyEvent.VK_A: 
      //move ship left 
      if(ship.getxPos()<20){ 
       ship.setxPos(20); 
      }else 
      ship.setxPos(ship.getxPos()-1); 
      break; 
     case KeyEvent.VK_D: 
      if(ship.getxPos()>1260){ 
       ship.setxPos(1260); 
      }else 
      ship.setxPos(ship.getxPos()+1); 
     } 
     repaint(); 
    }//end keypressed event 

    public static void main(String[] args){ 
     new Board(); 
    } 
} 

回答

4

這些答案在某種程度上取決於您嘗試創建的遊戲類型。

從谷歌搜索我導致相信我應該有一個用戶輸入線程和一個遊戲本身。

您創建了一個主遊戲循環,它在自己的線程中運行。在psudeocode

while (running) { 
    update game model 
    draw game 
    wait x milliseconds 
} 

您的用戶輸入將直接更新遊戲模型。遊戲循環會更新遊戲模型,如果計算機需要做出移動或對移動做出反應。然後,遊戲循環讀取遊戲模型並根據模型中的值繪製遊戲。

目前我已經在板類(代碼如下所示)上實現了KeyListener,我應該把它放到它自己的類中並使它實現可運行嗎?

是的,你應該把KeyListener放到它自己的類中。不,你不必把它作爲一個單獨的線程。

爲了節省您未來的麻煩,您應該在Event Dispatch線程中定義和使用Swing組件。

下面是你如何做到這一點。

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      new Board(); 
     } 
    }); 
} 

我應該使用的JPanel,而不是JFrame中和的paintComponent()用塗料()?

是的。

你應該在JFrame中有一個JPanel。 JPanel是使用paintComponent方法執行繪製遊戲psudeocode的地方。

有些人會不同意我的看法,但是我發現如果遊戲中的每個對象都有繪製方法來繪製它,那麼最好。

public void draw(Graphics g) 

的博弈模型也將有一場平局方法,其中提請所有對象的模型。

JPanel中的paintComponent方法是這樣的:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    gameModel.draw(g); 
} 
+0

感謝吉爾伯特,一個晚上的休息和您的回覆得到它的工作。 – SocialistPig 2013-03-01 10:54:30