2013-07-02 72 views
1

我在互聯網上發現了一個用於創建2D圖形遊戲的培訓,並且基於該代碼編寫了下面的代碼,但是當我編譯這個時候什麼也沒有發生! 它只是顯示一個沒有任何內容的窗口。通過使用drawString和drawLine我真的希望看到一些東西,但窗口是空的!有什麼問題 ? 是代碼錯誤?還是我使用錯誤的方法?在java圖形中使用緩衝區

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics2D; 
import java.awt.image.BufferStrategy; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends Canvas { 
    BufferStrategy strategy; 
    boolean gameRunning = true; 

     public Game() {  
      JFrame jf = new JFrame("My Graphic thingy !"); 

     JPanel panel = (JPanel) jf.getContentPane(); 
     panel.setPreferredSize(new Dimension(800, 600)); 
     panel.setLayout(null); 

     setBounds(0, 0, 800, 600); 
     panel.add(this); 

     setIgnoreRepaint(true); 
     jf.pack(); 

     jf.setResizable(false); 
     jf.setVisible(true); 

     jf.createBufferStrategy(2); 
     strategy = jf.getBufferStrategy(); 

    } 

    public void gameLoop() { 
     long lastLoopTime = System.currentTimeMillis(); 
     while (gameRunning) { 
      lastLoopTime = System.currentTimeMillis(); 

      Graphics2D g = (Graphics2D) strategy.getDrawGraphics(); 
      g.setColor(Color.black); 
      g.fillRect(0, 0, 800, 600); 
      g.drawString("HellO", 12,12); 
      g.drawLine(10, 10, 30, 30); 
      g.dispose(); 
      strategy.show(); 
      try { 
        Thread.sleep(2000); 
      } catch (Exception e) { 
      } 
     } 
    } 
    public static void main(String[] args) { 
     Game g = new Game(); 

     g.gameLoop(); 
    } 

} 

回答

5

您當前的循環可能會佔用了Swing Ë發泄d ispatch 牛逼 hread或EDT,因爲這一切都重要線索有效凍結您的應用程序是從做防止它必須做 - 呈現您的應用程序並回應用戶輸入。通過確保循環在後臺線程中運行,您需要考慮線程。如果說,如果建議您使用Canvas等AWT組件進行編碼,並且它建議您使用零布局和組件的絕對定位(即,使用setBounds(...))。根據教程,使用所有Swing組件和Swing圖形會更好。

請看看:


編輯:另外,

  • 您不應該嘗試直接繪製到JFrame,而是繪製JPanel,通常在其paintComponent(...)方法中繪製,儘管有些遊戲做不同的事情並使用主動渲染而不是典型的被動渲染。
  • 請勿爲背景使用與您的繪圖文字相同的顏色,因爲如果它們相同,您將永遠看不到任何文字。

編輯2:例如,

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class Game2 extends JPanel { 
    private static final int PREF_W = 800; 
    private static final int PREF_H = 600; 
    private static final int TIMER_DELAY = 50; 
    private static final int DELTA_WIDTH = 50; 
    private static final Color HELLO_COLOR = new Color(150, 150, 255); 
    private int delta = 0; 
    private BufferedImage img; 

    public Game2() { 
     img = createMyImage(); 
     setBackground(Color.BLACK); 
     new Timer(TIMER_DELAY, new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      delta++; 
      repaint(delta - 10, delta - 10, DELTA_WIDTH + 20, DELTA_WIDTH + 20); 
     } 
     }).start(); 
    } 

    private BufferedImage createMyImage() { 
     BufferedImage myImg = new BufferedImage(DELTA_WIDTH, DELTA_WIDTH, 
      BufferedImage.TYPE_INT_ARGB); 
     Graphics g = myImg.getGraphics(); 
     g.setColor(HELLO_COLOR); 
     g.drawString("Hello", 12, 12); 
     g.setColor(Color.red); 
     g.drawLine(10, 10, 30, 30); 

     g.dispose(); 
     return myImg; 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(img, delta, delta, this); 
    } 

    private static void createAndShowGui() { 
     JFrame frame = new JFrame("Game2"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new Game2()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

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