0

更新解決策を見つけました:D 返信ありがとうございますが、どれも本当の問題ではありませんでした。私の問題は、画像を A​​rrayList に追加した後に画像を初期化していたことです。

だから私はTileという名前のクラスを持っています:

public class Tile {
BufferedImage img;
int x,y;

public Tile(BufferedImage image, int x, int y)
{
    this.x = x;
    this.y = y;
    this.img = image;
}

public int getX(){
    return x;
}
public int getY(){
    return y;
}
public BufferedImage getImage(){
    return img;
}
}

次に、DATA_IMAGES という名前の画像変数を保持するクラスがあります。

public class DATA_IMAGES {
//terrain
public static BufferedImage SNOW;
public static BufferedImage GRASS;
public static BufferedImage CAVE;

//Entities
public static BufferedImage TREE;
public static BufferedImage player;
public static int frame = 1;
public static void initImages(){
    try {
        player = ImageIO.read(new File("res/images/player/f1.png"));
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null,"Can't Load Images "+e.getMessage(),"Fatal Error",JOptionPane.ERROR_MESSAGE);
        System.exit(0);
    }
    try{
    //SNOW = new ImageIcon("res/images/snow.png").getImage();
    //CAVE = new ImageIcon("res/images/snow.png").getImage();
    GRASS = ImageIO.read(new File("res/images/grass.png"));

    TREE = ImageIO.read(new File("res/images/tree.png"));
    }catch(Exception ex){
        JOptionPane.showMessageDialog(null,"Can't Load Images","Fatal Error",JOptionPane.ERROR_MESSAGE);
        System.exit(0);
    }



}
}

したがって、これをテストしていたときに、Main という名前のクラスがあります。

public class Main extends JFrame {
private static final long serialVersionUID = 6149918602875295087L;
public static void main(String args[]){
    new Main();
}
TileHelper tiles = new TileHelper(TileHelper.MAIN_LIST);
public Main(){
    TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100));
    DATA_IMAGES.initImages();
    setSize(640,480);
    setResizable(false);
    setTitle("Stranded");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);

    setVisible(true);

    createBufferStrategy(2);
    GameLoop();
}
public void GameLoop(){
    Thread gameloop = new Thread(){
        public void run(){
            while(true){
                RenderInit();
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    gameloop.start();
}
public void RenderInit(){
    BufferStrategy buff = getBufferStrategy();
    Graphics g = buff.getDrawGraphics();

    g.clearRect(0, 0, getWidth(), getHeight());
    g.drawString("COOL TEXT", 100, 100);

    Render(g);

    g.dispose();
    buff.show();
    Toolkit.getDefaultToolkit().sync();
}
public void Render(Graphics g){
    tiles.RenderAll(g);
}

}

次に、TileHelper クラスもあることに気づいたかもしれません。

public class TileHelper {
ArrayList<Tile> list;
//Main list for adding tiles
public static ArrayList<Tile> MAIN_LIST = new ArrayList<Tile>();

public TileHelper(ArrayList<Tile> list){
    this.list = list;
}

public void RenderAll(Graphics g){
    for(int i = 0; i < list.size(); i++){
        Tile t = new Tile(list.get(i).getImage(), list.get(i).getX(),list.get(i).getY());
        g.drawImage(list.get(i).getImage(),t.getX(),t.getY(),null);
        System.out.println(t.getX()+"  "+t.getY() + list.get(i).getImage().getHeight());
    }
}
}

よく見ると、x 値、y 値、および画像の高さが出力されていることがわかります。何らかの理由で BufferedImage が設定されていないため、null ポインターを取得し続けますか?

質問BufferedImage が認識され、null ポインターを取得しないようにするにはどうすればよいですか。

必要な場合に備えて、ここにエラーがあります...

Exception in thread "Thread-3" java.lang.NullPointerException
at com.survivalpixel.stranded.TileHelper.RenderAll(TileHelper.java:19)
at com.survivalpixel.stranded.Main.Render(Main.java:60)
at com.survivalpixel.stranded.Main.RenderInit(Main.java:53)
at com.survivalpixel.stranded.Main$1.run(Main.java:35)
4

3 に答える 3

5
public Main(){
    TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100));
    DATA_IMAGES.initImages();
    // ...

この 2 行を入れ替える必要があります。DATA_IMAGES.GRASSまだnull呼び出す前initImages()です。

(真剣に、コンストラクターの開始点にブレーク ポイントを配置し、それをステップ実行しただけであれば、それは簡単に理解できたはずです。)

于 2012-08-05T21:28:19.767 に答える
3

DATA_IMAGES.GRASSTileHelper.MAIN_LIST に追加すると null になります。

GRASS 画像を追加した後に DATA_IMAGE.initImages() を呼び出すだけなので、GRASS 画像は追加時に null になります。

DATA_IMAGES.initImages();
TileHelper.MAIN_LIST.add(new Tile(DATA_IMAGES.GRASS,100,100));
于 2012-08-05T21:29:38.507 に答える
0

initImages関数ではなく静的初期化ブロックの方が良いでしょう。そのままでは、初期化する変数を使用する前に呼び出されることを確認する必要があります。であることを確認しましたか?

于 2012-08-05T21:30:45.487 に答える