JComponent的重绘方法不起作用

时间:2015-05-18 15:33:57

标签: java nullpointerexception 2d-games

我正在制作2D游戏,现在我遇到了问题。 以下代码的最后一个目标是在全屏窗口中移动对象。

这是我的代码的一部分:

public class mainTest {
public static void main(String args[])
{
    DisplayMode displayMode=new DisplayMode(1024,768,64,75);
    GameScreen gameScreen=new GameScreen(displayMode,"background.jpg");
    Sprite s=new Sprite("some.png");
    gameScreen.addSprite(s);
    gameScreen.start();
}
}

我使用了两种start()方法。一个导致NullPointerException并且我已对其进行了评论而另一个无效:

public class GameScreen extends JComponent{
    private Screen screen;
    private ArrayList<Sprite> sprites=new ArrayList<Sprite>();
    private Image background;

    //...(constructor)

    public void addSprite(Sprite sprite)
    {
        sprites.add(sprite);
    }
//  public void draw()
//  {
//      Graphics g=screen.getWindow().getGraphics();
//      g.drawImage(background,0,0,null);
//      for(Sprite i:sprites)
//      {
//          g.drawImage(i.getImage(),(int)i.getX(),(int)i.getY(),null);
//      }
//      g.dispose();
//  }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(background,0,0,null);
        for(Sprite i:sprites)
        {
            g.drawImage(i.getImage(),(int)i.getX(),(int)i.getY(),null);
        }
        g.dispose();
    }
    public void start()
    {
        //draw();
        repaint();
        long currentTime=System.currentTimeMillis();
        while(true)
        {
            long elapsedTime=System.currentTimeMillis()-currentTime;
            for(Sprite i:sprites)
            {
                i.update(elapsedTime);
            }
            currentTime+=elapsedTime;
            //draw();
            repaint();
        }
    }
}

这是我的Sprite课程update()方法:

public void update(long elapsedTime)
    {
        x+=vx*elapsedTime;
        y+=vy*elapsedTime;
    }

vx时,vy显示速度。

正如您所看到的,我首先使用方法getGraphicsI()来获取Graphics对象并在我的drawImage()方法中调用其draw()方法,但正如我所说的那样{{1} }。所以,

1.对窗口的NullPointerException意味着什么,

2.为什么我得到例外?

3.为什么我getGraphics() dispose()反对?或者更好的问题:我应该Graphics吗?

然后我用另一种方式:让我的课程扩展dispose(),覆盖JComponent并在paintComponent()方法中使用repaint()。所以,

4.是否适合让这个课程延伸start()?这是否意味着JComponent课程是一个画画的地方?

5.为什么我的代码不起作用?它进入无限循环,不退出。 但为什么我在屏幕上看不到任何东西?

更新 有关更多信息,这是我的GameScreen类:

Screen

更新2:

public class Screen { private DisplayMode displayMode; private JFrame window; private GraphicsDevice device; public Screen (DisplayMode dm) { window=new JFrame(); device=GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); displayMode=dm; } public void setFullScreen() { device.setFullScreenWindow(window); device.setDisplayMode(displayMode); window.setResizable(false); window.setUndecorated(true); window.setBackground(Color.black); window.setForeground(Color.white); } public Window getWindow() { return device.getFullScreenWindow(); } } 的堆栈跟踪:

  

线程中的异常&#34; main&#34;

的java.lang.NullPointerException      

GameScreen.draw(GameScreen.java:25)

     

GameScreen.start(GameScreen.java:46)

     

mainTest.main(mainTest.java:11)​​

NullPointerException类的第25行属于GameScreen方法。

注意:

我的问题不是由无限循环引起的,因为我改变了程序,使循环在两秒后结束;但我的问题没有解决,我在屏幕上什么也没看到。

0 个答案:

没有答案