我正在开发受 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...(实际上我使用了一个中间 bufferImage)我使用了一个游戏循环所以这会连续发生。
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 获取图形。
自从开始这个问题以来,我在这个问题上做了很多工作,我认为这里是问题的真正症结所在:为什么我不能在离开全屏的同一周期内获得窗口的图形?
最佳答案
美国东部时间。为什么问题总是在我不注意的地方。是的,问题是我的游戏循环是基于 swing.timer 的。这是一个新手犯的错误,事实上,我花了将近一周的时间才弄明白,这让我的自尊心受到了沉重打击。
显然很多 Swing 操作都是在 EDT 上进行的,用它来更新和绘制不仅堵塞了吸盘,而且导致了这个问题的问题。
现在我要在主线程中使用 while() 进行可变时间步长循环。 (即使使用只有 update() 和 draw() 的基本 while 循环,问题也消失了)
在开始我的程序之前应该至少阅读一篇关于游戏循环的文章。生活和学习(并浪费一周的时间被难倒)。
关于java - 全屏和窗口模式切换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16151752/