2016-09-17 4 views
0

私はJavaで描かれた画像を取得するのに問題があります。コンソールエラーはなく、 '描画'が印刷されます。私はイメージを間違って読み込んでいると信じていますが、正しい方法を理解することはできません。誰かが私に偉大な正しい方法を教えてくれたら。jframe gameの画像を描画する

 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

これはあなたの質問には答えませんが、イメージが1つしかないので、配列は必要ありません。ちょうど '私のイメージimg;'をしてください。 –

+0

また、数字で終わる名前を避けることをお勧めします。クラス名はもっと意味があるはずです。変数名を数値で終わらせる場合、本当に 'List'か'配列が必要です。 –

+0

あなたがここに投稿したコードは、あなたのゲームに関係するすべての余分なものによって複雑になります。画像をロードして表示するだけの例として別のクラスを作成することをお勧めします。それでも問題が解決しない場合は、簡単なバージョンでこの質問を編集してください。 –

答えて

0

スイングにはイベント処理を行う無限ループがあります。 while(true)ループは必要ありません。すべてのUIが設定されたら、frame.setVisible(true)に電話する必要があります。私はそれがmain()の最後のものでなければならないことを意味します。また、あなたが

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

(だから、メインとUIスレッドでこれを行う必要があります)

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

のようになります。しかし、主な問題は、tryです... initの中のcatch()は無視されています例外。あなたはキャッチを空にしてはいけません。少なくとも、スタックトレースを出力してください。

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また、ここで私のコードスニペットのエラーのために私のお詫び。私はそれを修正した。 –