我正在开发一个受XNA启发的游戏框架。几乎每一天我都会发现这个或那个新问题。今天,它从窗口模式变为全屏幕,然后返回。它的要点是:
如果我在窗口模式下启动游戏,它可以正常工作。当我全屏工作也很好。从全屏切换回来后出现问题,屏幕上没有任何内容。再次进入全屏工作正常。我只是在窗口模式下遇到这个问题,除非游戏开始。
我以这种方式设置窗口:
public void setW(){
jFrame.setVisible(false);
if(graphicDevice.getFullScreenWindow() != null && jFrame.isDisplayable())graphicDevice.getFullScreenWindow().dispose();
graphicDevice.setFullScreenWindow(null);
jFrame.setResizable(false);
jFrame.setUndecorated(false);
jFrame.getContentPane().setPreferredSize(new Dimension(width, height));
jFrame.setVisible(true);
jFrame.pack();
graphics = (Graphics2D)jFrame.getContentPane().getGraphics();
fullScreen = false;
}
全屏设置如下
public void setFS(){
jFrame.setVisible(false);
if(jFrame.isDisplayable())jFrame.dispose();
jFrame.setResizable(false);
jFrame.setUndecorated(true);
graphicDevice.setFullScreenWindow(jFrame);
graphicDevice.setDisplayMode(new DisplayMode(width, height, 32, 60));
graphics = (Graphics2D)jFrame.getContentPane().getGraphics(); // graphicDevice.getFullScreenWindow().getGraphics(); does the same thing
fullScreen = true;
}
然后我使用这个方法来绘制... deviceManager.getGraphics()。draw ...(实际上我使用的是中间缓冲区图像)我使用游戏循环,所以这种情况会持续发生。
public Graphics2D getGraphics(){
return graphics;
}
现在,如果我使用这种方法:
public Graphics2D getGraphics(){
if(fullScreen)
return (Graphics2D)graphics;
else
return (Graphics2D)jFrame.getContentPane().getGraphics();
}
我确定我做错了什么。我知道,窗口模式有效。当我从全屏返回时,它为什么会呈梨形。窗口只是保持灰色,没有任何东西被涂上。
但是,如果我创建这样的方法:
public void assignGraphics(){
graphics = (Graphics2D)jFrame.getContentPane().getGraphics()
}
稍后调用它(一个游戏周期通过)它解决了问题。这就是第二种模式切换方法有效的原因,因为它在每个周期从JFrame获取图形。
自从开始这个问题以来我已经解决了这个问题,我在这里就是它真正的关键所在:为什么我不能在同一个循环中获得一个窗口的图形而是全屏?
答案 0 :(得分:3)
EDT。怎么问题总是在我不看的地方。是的,问题是我的游戏循环是基于swing.timer的。这是一个新手的错误,事实上,我花了差不多一个星期的时间来解决这个问题,在我的自我中沉重下来。
很明显,许多挥杆操作在EDT上进行,并且使用它进行更新和绘图不仅阻塞了吸盘,而且导致了这些问题。问题。
现在我在主线程中使用while()进行可变时间步循环。 (即使使用只有update()和draw()的基本while循环,问题也就消失了)
在开始我的程序之前,至少应该阅读一篇关于游戏循环的文章。生活和学习(浪费一个星期被困)。