Java中的Space Invaders ...组件或绘画

时间:2012-06-22 19:28:50

标签: java swing user-interface

我在Java方面经验丰富,而且我使用Swing(表单类型的应用程序)做了一点,但我从来没有需要更多的功能,因此我不太了解引擎盖GUI下发生了什么 - 明智的。这是我从我一直在做的一点点阅读中收集的内容。我确定它已经关闭了。

在编写太空入侵者类型游戏时,我想到的两种方法是:

  1. 为所有增量绘画和分层创建一个大组件和代码。
  2. 在包含文本和图像的JLayeredPane中创建一堆嵌套的绝对定位的JPanel,然后对可能需要重绘的那些调用repaint()。然后覆盖paintComponent()(不确定是否自动清除以前的内容)。根据我的阅读,这将处理组件的分层和重绘,而无需重绘整个屏幕。
  3. 这是对的吗?如果是这样,哪种方法更适合该项目?

2 个答案:

答案 0 :(得分:3)

当谈到Java中的游戏编程时,要真正考虑的一件事是切换到Active Rendering。

正如我们所知,Swing负责在另一个线程中进行渲染,称为Event Dispatch Thread。这被称为被动渲染,因为您并不真正渲染自己的可视组件,而是定义了应用程序的外观,而Swing实际上是在他想要的时候绘制它。

游戏通常以全屏模式运行,并且通常需要对“何时”,“如何”和“什么”进行更多控制。这称为主动渲染。在这种情况下,您必须禁用Even Dispatch Thread并自行完成渲染。

这一切都有道理,因为游戏经常在一个大循环中运作。游戏循环的一个例子是:

  1. 获取输入数据(键盘,操纵杆等)
  2. 网络通信(在客户端 - 服务器游戏的情况下)
  3. 根据输入数据处理逻辑。 (最终,当用户告诉它时,这将导致游戏退出)。
  4. 更新游戏的状态机。
  5. 根据新状态重绘场景
  6. 重新启动循环。
  7. 有很多来源,但我可以建议在第一时间阅读以澄清:Passive vs Active Rendering

答案 1 :(得分:2)

关于您的方法的一些想法

第一种方法可能会表现得更好,因为您可以在整个绘图中使用单个VolatileImage。但是,你说它比第二种方法更复杂,因为你必须自己处理所有的分层。

第二种方法不仅仅是出于你陈述的原因,而且因为如果你需要做任何事情,比如当鼠标在屏幕上输入特定的“精灵”时处理,这是由Java的JPanel自动提供给你的实现。那就是说...... Space Invaders克隆通常由键盘控制,所以你是否真正使用这个功能完全是另一个故事。

底线...我通常最终在paint()范例中做这种事情。分层绘画并不是那么难,特别是像Space Invaders这样简单的东西,如果你决定使用VolatileImage作为后台缓冲区,它会使性能提升更容易。

其他想法

正如其他人所说的那样,很难获得一致的“帧速率”,因为你无法控制“什么时候”呈现某些东西 - 这是由EDT决定的,它与你的代码异步运行。如果您决定依赖EDT,则可以尝试使用SwingTimer进行渲染。另外要小心,以便正确地将渲染和更新同步到基础游戏状态。