我在Java方面经验丰富,而且我使用Swing(表单类型的应用程序)做了一点,但我从来没有需要更多的功能,因此我不太了解引擎盖GUI下发生了什么 - 明智的。这是我从我一直在做的一点点阅读中收集的内容。我确定它已经关闭了。
在编写太空入侵者类型游戏时,我想到的两种方法是:
这是对的吗?如果是这样,哪种方法更适合该项目?
答案 0 :(得分:3)
当谈到Java中的游戏编程时,要真正考虑的一件事是切换到Active Rendering。
正如我们所知,Swing负责在另一个线程中进行渲染,称为Event Dispatch Thread。这被称为被动渲染,因为您并不真正渲染自己的可视组件,而是定义了应用程序的外观,而Swing实际上是在他想要的时候绘制它。
游戏通常以全屏模式运行,并且通常需要对“何时”,“如何”和“什么”进行更多控制。这称为主动渲染。在这种情况下,您必须禁用Even Dispatch Thread并自行完成渲染。
这一切都有道理,因为游戏经常在一个大循环中运作。游戏循环的一个例子是:
有很多来源,但我可以建议在第一时间阅读以澄清:Passive vs Active Rendering
答案 1 :(得分:2)
关于您的方法的一些想法
第一种方法可能会表现得更好,因为您可以在整个绘图中使用单个VolatileImage。但是,你说它比第二种方法更复杂,因为你必须自己处理所有的分层。
第二种方法不仅仅是出于你陈述的原因,而且因为如果你需要做任何事情,比如当鼠标在屏幕上输入特定的“精灵”时处理,这是由Java的JPanel自动提供给你的实现。那就是说...... Space Invaders克隆通常由键盘控制,所以你是否真正使用这个功能完全是另一个故事。
底线...我通常最终在paint()
范例中做这种事情。分层绘画并不是那么难,特别是像Space Invaders这样简单的东西,如果你决定使用VolatileImage
作为后台缓冲区,它会使性能提升更容易。
其他想法
正如其他人所说的那样,很难获得一致的“帧速率”,因为你无法控制“什么时候”呈现某些东西 - 这是由EDT决定的,它与你的代码异步运行。如果您决定依赖EDT,则可以尝试使用SwingTimer
进行渲染。另外要小心,以便正确地将渲染和更新同步到基础游戏状态。