用于显示始终全屏游戏的Java框架?

时间:2014-12-08 18:29:26

标签: java swing

目前我的JFrame始终设置为全屏,JPanel的分辨率可以更改,而BufferedImage则绘制在JPanel上,并且是我游戏的固定分辨率。我觉得这样效率非常低,因为可能有三种不同的分辨率,JFrame用作屏幕分辨率的全屏,用户设置的JPanel自定义分辨率,游戏的分辨率可能与我调整大小的位置不同在画画之前两次。

像战地这样的现代游戏如何让你改变分辨率,他们总是全屏,他们不只是在他们调整大小时调整窗口大小,因为我有一个双屏幕,一个电视,它实际上显示我改变了分辨率由于改变了游戏的分辨率,尽管我的电视可以拍摄1920 x 1080的最大值,但它仍然是全屏的?我需要的只是绘制像素,我甚至不需要添加来自摇摆或类似的按钮,我会自己做。我的游戏应该始终是全屏的。我一直在制作我的游戏,我对使用JFrame和JPanel非常满意,但如果效率更高,我真的想切换到别的东西。你觉得我能做什么?

3 个答案:

答案 0 :(得分:3)

你可以试试这个:

Toolkit.getDefaultToolkit().getScreenResolution();

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
gd.setFullScreenWindow(app);

另请看一下这篇文章:

In JAVA, changing resolution with setDisplayMode for fullscreen application

答案 1 :(得分:0)

渲染到 fixed 大小的BufferedImage有点失败了,除非你明确地想要缩放(例如,因为你不能足够快地渲染完整的res)。

您需要做的就是在帧大小改变时调整后台缓冲区的大小(当然,根据当前大小渲染它)。

您可以使用附加到JFrame的WindowListener或附加到包含的面板的ComponentListener轻松检测更改。为了灵活性,我个人更喜欢面板上的ComponentListener,因为这使您可以使用相同的面板和监听器进行窗口或全屏模式。虽然在Swing事件调度线程上调用侦听器,但要小心谨慎,因此根据游戏的线程架构,您可能需要一些线程同步来安全地传达更改。

答案 2 :(得分:0)

战场之类的游戏方式是使用OpenGL或DirectX独立于屏幕分辨率的3D世界坐标。开发人员将世界坐标提供给渲染引擎,然后转换为屏幕坐标。无论当前屏幕分辨率设置为何,都可以完成此操作。您会注意到HUD的大小会根据您选择的分辨率而改变。这是因为HUD通常是直接与屏幕坐标相关联的2D构造。如果你想做一些3D东西我会推荐LWJGL。使用Swing的唯一选择是使用AffineTransform来扩展显示。然而,与3D相比,这是低效的,并且可能比您想要的要慢。