java - Java 中的太空入侵者...组件或绘制

标签 java swing user-interface

我在 Java 方面经验丰富,并且对 Swing(表单类型应用程序)做过一些工作,但我从来没有需要比这更多的功能,所以我不太了解 GUI 的底层情况 -明智的。这是我从我一直在做的一点点阅读中收集到的内容。我确信它已关闭。

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

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

这是正确的吗?如果是,哪种方法更适合该项目?

最佳答案

当涉及到 Java 游戏编程时,需要真正考虑的一件事是切换到主动渲染。

众所周知,Swing 在另一个线程(称为事件调度线程)中负责渲染。这称为被动渲染,因为您并不真正渲染自己的可视组件,而是定义应用程序的外观,然后 Swing 在需要时实际绘制它。

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

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

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

有很多来源,但我可以建议先阅读此内容以澄清这一点:Passive vs Active Rendering

关于java - Java 中的太空入侵者...组件或绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11162870/

相关文章:

java - 将 Stream 包装到 Flux 时的事务处理

java - Spring JdbcTemplate 和线程

java - 如何使用java获取连接到计算机的USB设备的详细信息

python - 如何将 ttk.Notebook 框架配置为平面浮雕?

java - Spring @Transactional 方法错误处理

java - Maven 依赖项失败并出现 501 错误

java - 如何修复 - 41 : non-static variable cannot be referenced from a static context -> What is the reason for this?

java - JFormattedTextField 的 setValue 不显示在 GUI 上

Java-随机生成矩形

javascript - 动态增长文本输入数组 (HTML/JavaScript)