在全屏和窗口模式之间切换失败

时间:2013-04-22 16:13:37

标签: java swing drawing jframe fullscreen

我正在开发一个受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获取图形。

自从开始这个问题以来我已经解决了这个问题,我在这里就是它真正的关键所在:为什么我不能在同一个循环中获得一个窗口的图形而是全屏?

1 个答案:

答案 0 :(得分:3)

EDT。怎么问题总是在我不看的地方。是的,问题是我的游戏循环是基于swing.timer的。这是一个新手的错误,事实上,我花了差不多一个星期的时间来解决这个问题,在我的自我中沉重下来。

很明显,许多挥杆操作在EDT上进行,并且使用它进行更新和绘图不仅阻塞了吸盘,而且导致了这些问题。问题。

现在我在主线程中使用while()进行可变时间步循环。 (即使使用只有update()和draw()的基本while循环,问题也就消失了)

在开始我的程序之前,至少应该阅读一篇关于游戏循环的文章。生活和学习(浪费一个星期被困)。

相关问题