2016-09-17 125 views
0

我在使用java繪製圖像時遇到了一些麻煩。沒有控制檯錯誤,並打印「繪圖」。我相信我加載錯誤的圖像,但我無法找出正確的方法。如果有人能告訴我那種好的方法。在jframe遊戲中繪製圖像

 package platformer; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Image; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.Timer; 
import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import java.awt.Image; 

public class test2 extends JPanel implements KeyListener, ActionListener { 

    int Width = 1000; 
    int Height = 600; 
    private static Image offScreenBuffer;// needed for double buffering graphics 
    private Graphics offScreenGraphics;// needed for double buffering graphics 
    private BufferedImage[] img = new BufferedImage[1]; 

    public test2() { 

    } 

    public void paint(Graphics g) { 

     super.paint(g); 
       g.drawImage(img[0],0,0,null); 
    } 

    public void timer1() { 
     int delay = 30; // milliseconds 
     new Timer(delay, this).start(); 
     try { 
      Thread.sleep(10); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void actionPerformed(ActionEvent evt) { 

    } 

    public static void main(String args[]) throws InterruptedException, Exception { 

     test2 test2 = new test2(); 
     JFrame frame = new JFrame("platformer"); 
     frame.setSize(test2.Width, test2.Height); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setBackground(Color.green); 
     frame.add(test2); 
     frame.setResizable(false); 
     frame.addKeyListener(test2); 
     test2.init(); 
     test2.timer1(); 
     // What to do after the program starts 
     while (true) { 
      test2.repaint(); 

     } 
    } 

    public void init() { 


     try { 
      URL url = new URL("platform.png"); 
      img[0] = ImageIO.read(url); 
     } catch (IOException e) { 
     } 


    } 

    public void keyTyped(KeyEvent e) { 
    } 
    public void keyPressed(KeyEvent e) { 
    } 
    public void keyReleased(KeyEvent e) { 
    } 



} 
+0

這並不回答你的問題,但由於你只有一個圖像,你不需要一個數組。只要做'私人Image img;'。 –

+0

我也建議避免用數字結尾的名字。類名應該更有意義。如果你用數字結束變量名,那麼你確實需要一個List或者一個數組。 –

+0

您在這裏發佈的代碼由於遊戲中涉及的所有額外材料而變得複雜。我建議創建另一個類作爲僅加載圖像並顯示它的示例。如果您仍然遇到麻煩,請使用簡化版本編輯此問題。 –

回答

0

Swing有一個無限循環,可以爲您處理事件。您不需要while(true)循環。完成所有用戶界面配置後,您應該撥打frame.setVisible(true)。我的意思是它應該是main()中的最後一件事。此外,你應該用

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     frame.setVisible(true); 
    } 
}); 

所以主()看起來應該像

public static void main(String args[]) throws InterruptedException, Exception { 

     test2 test2 = new test2(); 
     JFrame frame = new JFrame("platformer"); 
     frame.setSize(test2.Width, test2.Height); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setBackground(Color.green); 
     frame.add(test2); 
     frame.setResizable(false); 
     frame.addKeyListener(test2); 
     test2.init(); 
     test2.timer1(); 
     SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     frame.setVisible(true); 
    } 
}); 
    } 

然而,主要的問題是嘗試做到這一點的UI線程上...在初始化捕獲()而忽略例外。你絕對不應該把空檔留下。至少你應該打印一個堆棧跟蹤。更重要的是,適當的例外添加到方法的throws子句是​​這樣的:

public void init() throws IOException { 
      URL url = new URL("platform.png"); 
      img[0] = ImageIO.read(url); 
    } 

注意如果出現問題,你會立刻知道。

+0

我不明白如何獲取圖像顯示,我可以畫好矩形,但圖像不起作用。 – MickDom

+0

@MickDom我建議刪除整個'if(level == 1)',並用一個簡單的'g.drawImage()'代替它。當你這樣做會發生什麼? –

+0

@MickDom另外,我在這裏的代碼片段中的錯誤表示歉意。我修好了。 –