我正在制作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.NullPointerExceptionGameScreen.draw(GameScreen.java:25)
GameScreen.start(GameScreen.java:46)
mainTest.main(mainTest.java:11)
NullPointerException
类的第25行属于GameScreen
方法。
注意:
我的问题不是由无限循环引起的,因为我改变了程序,使循环在两秒后结束;但我的问题没有解决,我在屏幕上什么也没看到。