0

我在 Java 方面经验丰富,并且在 Swing(表单类型应用程序)方面做了一些工作,但我从来不需要比这更强大的功能,所以我不太了解 GUI 方面的情况。这是我从我一直在做的一点点阅读中收集到的。我确定它已经关闭了。

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

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

它是否正确?如果是这样,哪种方法更适合该项目?

4

2 回答 2

3

当谈到用 Java 进行游戏编程时,真正要考虑的一件事是切换到主动渲染。

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

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

这一切都说得通,因为游戏通常在一个大循环中运行。游戏循环的一个示例是:

  1. 获取输入数据(键盘、操纵杆等)
  2. 网络通信(在客户端-服务器游戏的情况下)
  3. 根据输入数据处理逻辑。(最终,当用户告诉它时,这将导致游戏退出)。
  4. 更新游戏的状态机。
  5. 根据新状态重绘场景
  6. 重新启动循环。

有很多来源,但我可以建议第一次阅读以澄清这一点:被动与主动渲染

于 2012-06-22T19:40:57.863 回答
2

关于你的方法的一些想法

第一种方法可能会执行得更好,因为您可以只为整个绘图使用单个 VolatileImage。但是,您认为它比第二种方法更复杂是正确的,因为您必须自己处理所有分层。

第二种方法很好,不仅仅是因为您已经陈述的原因,还因为如果您需要在鼠标进入屏幕上的特定“精灵”时执行类似处理之类的操作,Java 的 JPanel 实现会自动提供给您。也就是说... Space Invaders 克隆通常由键盘控制,因此您是否实际使用此功能完全是另一回事。

底线......我通常最终会在paint()范式中做这种事情。分层油漆一点也不难,特别是对于像 Space Invaders 这样简单的东西,如果您决定将其VolatileImage用作后台缓冲区,它将更容易提高性能。

其他想法

正如其他人所说,很难在摇摆中获得一致的“帧速率”,因为您无法控制“何时”渲染某些东西 - 这是由 EDT 决定的,它与您的代码异步运行。如果您决定依赖 EDT,您可以尝试使用 aSwingTimer进行渲染。还要格外小心地同步您的渲染和更新到底层游戏状态。

于 2012-06-22T19:49:33.780 回答