JComponent的java重绘方法不起作用
我正在做一个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()
来获取图形对象,并在我的draw()
方法中调用了它的drawImage()
方法,但正如我所说,我得到了NullPointerException
。所以
一,。它对一个窗口的getGraphics()
意味着什么,以及
二,。为什么我会有例外
三,。我为什么要dispose()
{dispose()
它吗
然后我使用了另一种方法:使我的类扩展JComponent
,重写paintComponent()
,并在start()
方法中使用repaint()
。所以
四,。使这个类扩展JComponent
合适吗?这是否意味着GameScreen
类是一个可以绘制东西的地方
五,。为什么我的代码不起作用?它进入无限循环,而不退出。 但是为什么我在屏幕上什么都看不到呢
更新:
有关更多信息,请参阅我的Screen
类:
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();
}
}
更新2:
NullPointerException
的堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException at
GameScreen.draw(GameScreen.java:25) at
GameScreen.start(GameScreen.java:46) at
mainTest.main(mainTest.java:11)
其中GameScreen
类的第25行属于getGraphics()
方法
注意:
我的问题不是由无限循环引起的,因为我更改了程序,使循环在两秒钟后结束;但是我的问题没有解决,我在屏幕上什么也看不到
共 (0) 个答案