java - 全屏和窗口模式切换失败

标签 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...(实际上我使用了一个中间 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/

相关文章:

java - 运行 ADF Morena 应用程序时出错?

java - EJB 事务回滚异常

java - Java中的Swing框架具有人脸识别和语音识别功能

javascript - "Drawing"超过 html 文本

Java - 尝试在此 forLoop 的每次迭代上绘制图像

java - 循环并不能处理所有事情

Java:如何使滚动条以恒定速度滚动?

java - 表单验证无法正常工作

objective-c - 手指画的效率问题

java - 返回并打印字段值或仅通过类方法打印值?