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

我想是 Graphics 变量 dbg 为空,但它获得了dbImage.getGraphics();如何gameRender();修复此 NullPointerException?

我也在像这样的另一个类中调用 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实例this,而不是render.

您需要将其更改为

render.dbg.drawLine(....)

或者,如果您想保持dbg通话不变,您可以拨打

this.gameRender();

先调用再调用

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

dbg通过调用gameRenderon 进行设置render,但不是this.

于 2012-06-29T14:02:39.810 回答
1

由于 MC 扩展了渲染,因此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 回答