2

私は小さなアーケード ビデオ ゲームに取り組んでおり、アニメーションを改善するためにダブル バッファを探しています。空白の画像を描画するクラスと、単純な線を描画するクラスがあります。ただし、線が描画されるはずの行で NullPointerException を取得し続けます

class Render extends JPanel {
    public int dbWidth = 500, dbHeight = 400;
    public Image dbImage = null;
    public Graphics dbg;

    public void gameRender() {

        if( dbImage == null )  
            dbImage = createImage( dbWidth, dbHeight );

        dbg = dbImage.getGraphics();
        dbg.setColor( Color.white );
        dbg.fillRect( 0, 0, dbWidth, dbHeight );
    }
}

class MC extends Render {
    public Render render = new Render();

    public void draw() {
        render.gameRender();
        dbg.drawLine( 100, 100, 200, 200 ); // line where NullPointerException occurs
    }
}

null の Graphics 変数 dbg だと思いますが、この NullPointerException を修正するにdbImage.getGraphics();gameRender();どうすればよいですか?

このような別のクラスで draw() メソッドも呼び出しています

    public void run() {

    running = true;

    while( running ) {

        mc.draw();
        try {
            Thread.sleep( 50 );
        }
        catch( Exception e ) {}
    }
}

そのクラスのコンストラクターで、mc = new MC(); と言いました。

4

3 に答える 3

6

のインスタンスではなく、インスタンスを呼び出しdbgています。thisrender

に変更する必要があります

render.dbg.drawLine(....)

または、通話をそのままにしたい場合は、次のdbgように呼び出すことができます

this.gameRender();

最初に電話してから

dbg.drawLine(...);
于 2012-06-29T14:02:37.873 に答える
3

dbgを呼び出すことによってセットアップしますが、 を呼び出すことgameRenderrenderありませんthis

于 2012-06-29T14:02:39.810 に答える
1

MCはrenderを拡張するため、dbg参照しているのはdrawと呼ばれるMCインスタンスに属します。あなたは呼び出すことによってそれを修正することができます

render.dbg.drawLine( 100, 100, 200, 200 );

または、実装した継承を利用します

class MC extends Render {
    //MC is a render, so you don't need to create another one
    public void draw() {
        gameRender(); //Call the MC's own gameRender
        dbg.drawLine( 100, 100, 200, 200 );  //Calling gameRender initialized dbg so you won't get a NullPointerException
    }
}
于 2012-06-29T14:04:20.870 に答える