3

私は Ap コンピューター サイエンスの学生です。このクラスのプロジェクトは、好きなゲームを作成することです。パックマンゲームを作っています。私たちは GUI をあまり扱っていないので、私はまだ概念全体に非常に慣れていませんが、これは私がこれまでに持っているものです:

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.image.*;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;


public class GameHandler extends JFrame{


JPanel jpanel = new JPanel();
Graphics g;
BufferedImage pacman;
int frame;
int direction;
int x, y;
//final int STEP = 2; If you want to change the speed at which pacman moves accross the screen;

public void popupWindow() {
    setSize(400, 400);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame = 0;
    direction = KeyEvent.VK_LEFT;
    x = 300;
    y = 300;

    try {
        pacman = ImageIO.read(new File("pacman.png"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();


    }
          image();
}

public void keyPressed(KeyEvent e) {
    direction = e.getKeyCode();
}


public void update() {
    frame++;
    if (frame > 2) {
        frame = 0;
    }

    switch(direction) {
        case KeyEvent.VK_LEFT:
            x--;
            break;
        case KeyEvent.VK_RIGHT:
            x++;
            break;
        case KeyEvent.VK_UP:
            y--;
            break;
        case KeyEvent.VK_DOWN:
            y++;
            break;
    }
}

public void image() {   
    super.paintComponents(g);
    g.drawImage(pacman.getSubimage(frame*10, 0, 37, 30), x, y, null);
}
}

私の問題は、この画像を画面に出力できないことです(g.drawImage dimensiones出力なしで微調整できなかったという事実のために、私はオフであることを知っています)

image()メソッド内でメソッドを呼び出そうとすると、次のpopupWindow()エラーが発生します。

Exception in thread "main" java.lang.NullPointerException
at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:70)
at java.awt.Container.paintComponents(Container.java:1890)
at GameHandler.image(GameHandler.java:69)
at GameHandler.popupWindow(GameHandler.java:38)
at Main.main(Main.java:7)

イメージ メソッドをさまざまな場所で、また try/catch で呼び出してみました。迷っています。

4

1 に答える 1

3
public void image() {   
    super.paintComponents(g);
    g.drawImage(pacman.getSubimage(frame*10, 0, 37, 30), x, y, null);
}

gこのメソッドで使用するためにまだ設定されていません。あなたのクラスは定義していますGraphics g;が、どこにも設定されていません! それで、あなたは尋ねます、どうやってそれを設定しますか?Graphicsオブジェクトはどこから来るのですか?


現在のコード ベースに対する最速の答えは次のようになります。

JPanel jpanel = new JPanel();
Graphics g = jpanel.getGraphics();

しかし、これは理想的な解決策ではありません。


通常、このコード パターンは にありpaintComponentます。

あなたが目指すべきものは次のようなものです:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(...);
}

JPanel (JComponent のサブクラス) など、paintComponent任意のJComponentをオーバーライドできます。そこで、私がお勧めするのは

  • JPanel をオーバーライドする新しいクラスを追加する
  • JFrame.setContentPane()メイン JFrame のコンテンツ ペインとして設定するために使用します。
  • そのパネルの paintComponent をオーバーライドする
  • そのパネルを使用して、UI の変更を行います (JFrame の最上位のもののみ、コンテンツ ペインのその他すべて)。
于 2012-12-06T06:43:07.880 に答える