【问题标题】:What should I use to display game graphics?我应该使用什么来显示游戏图形?
【发布时间】:2018-11-10 01:33:42
【问题描述】:

我有一个游戏系统,但我不知道应该用什么来显示它。我正在制作一个垂直射击游戏,我已经为所有控制敌人和玩家的类编写了方法,但我不知道如何有效地展示游戏。我在想一个 Canvas,它会重新绘制每一帧,但这真的是最有效的方法吗?

重要细节:

  1. 理想帧率:25fps
  2. 这是一款 2d 游戏
  3. 屏幕上任何时候都有 25-100 个对象,所有对象都在移动
  4. 所有显示的对象都是图像,都是 PNG 格式
  5. 窗口为 640 x 480 像素
  6. 现在所有图像都作为 BufferedImage 加载,尽管我可以轻松更改此设置

7.我需要一个坐标平面。如果不完全重构我的代码,这是唯一无法更改的基本部分。

最重要的是我设置好所有东西的方式,每一帧所有对象都在我设计的坐标平面中移动和交互(处理碰撞检测和移动,没有图形组件),然后一切都应该绘制到屏幕上,只需通过 ArrayLists 跟踪所有移动对象并一一绘制它们。

【问题讨论】:

  • 这款游戏是 2d 还是 3d 游戏?
  • 我什至不确定你是否可以将 png 与 Graphics2D 一起使用,但我很快检查了一下,它看起来与 javax.imageiojava.awt.image.BufferedImage 一起使用。
  • 在这个时代不要使用Canvas。 Swing 等效项将是 JComponent 或(如果 UI 将自定义绘画与布局组件混合)JPanel

标签: java graphics


【解决方案1】:

如果 Swing 可接受,JPanel 默认为双缓冲,而周期为 40 毫秒的javax.swing.Timer 将为您提供 ~25 Hz 的更新。这个example 展示了基本方法,而这个example 展示了许多动态图像。

我需要一个坐标平面。

模型和视图使用不同的坐标并不罕见;所需要的只是将一个系统映射到另一个系统的功能。在这个game 中,视图依赖于将图块映射到像素的four methods,反之亦然。 here 为地图图块概述了相同的方法。

【讨论】:

    【解决方案2】:

    您有多种选择:

    首先,您可以使用现有的 Java 游戏框架之一:

    1. JMonkeyEngine (http://jmonkeyengine.com/)
    2. Slick (http://slick.cokeandcode.com/index.php)

    (Slick 针对 2D 图形,而 JMonkey 针对 3D 并使用 OpenGL - 虽然我研究过它们的用途,但我自己并没有真正使用过它们)

    您也可以自己编写所有代码。从事物的声音来看,这是您的第一个(图形)游戏,因此您可能想要阅读一种称为双缓冲的技术,通过这种技术,您可以将每一帧都写入屏幕外,然后将整个内容绘制到屏幕上,因为这样可以导致更流畅的动画。

    为了让您更深入地了解游戏开发,我强烈建议您阅读 Andrew Davison 博士的这个网站 Killer Game Programming in Java,因为他提供了一些很好的指导,并且还为新游戏开发人员提供了一个良好的渐进式学习路径,并且将它们转移到 2D 和 3D 开发中。

    HTH

    【讨论】:

      【解决方案3】:

      答案真的取决于这款游戏是 2D 还是 3D。

      如果您的游戏是 2D 的,那么一个简单的方法就是使用 Java 自己的 2D 图形 API。可以在The Java Tutorials 找到一个很好的入门教程(至少在我看来)。根据我的经验,我发现 Java 的图形 API 易于学习,并且比人们预期的更高效。基本技术是让您的游戏代码跟踪所有对象的位置,然后将这些坐标转换为屏幕坐标并在这些位置显示适当的图像。我曾经用 Java 制作了一个(非常非常简单的)游戏,这就是我使用的方法。

      如果您的游戏是 3D 的,那么 OpenGL 无疑是最佳选择。我对 OpenGL 的经验有限,所以我不确定 Java 绑定的使用有多容易。一般来说,3D 编程是一个庞大的话题,所以如果这是一个首次项目,或者你没有准备好投入大量时间,我会尝试找到一个好的游戏框架来使用或制作 2D 游戏。如果您对 OpenGL 或一般的 3D 编程感兴趣,可以快速通过 Google 找到JOGL 项目。我建议研究 JOGL 作为从 Java 代码中访问 OpenGL API 的一种方式,但对于实际学习 OpenGL,我推荐The OpenGL SuperBible(5th edition),通常称为“蓝皮书”。 代码示例都在 C++ 中,但对于 OpenGL 函数,它可能只是使用包装库的问题。例如:

      glDrawElements(...);
      

      可能变成:

      JavaGLWrapperObject.glDrawElements(...);
      

      很遗憾,我无法给出具体的例子,因为我没有在 Java 程序中使用过 OpenGL,但上面的例子非常粗略地近似了 OpenGL ES 在 Android 平台上的使用方式。

      就性能而言... Java 的 API 带来了不小的开销,但我可以看到它对于您的目的来说没问题。您可能需要付出更多努力来提高算法效率,并且您的游戏可能无法在功能较弱的硬件上运行得那么好。如果您确实决定采用 OpenGL 路线,它几乎肯定会快得多(同样,取决于您的算法的效率),但相应地要学习得多并开始使用。当然可行,但这将是一个挑战。

      【讨论】:

        【解决方案4】:

        对于 25+ fps 的目标,Canvas 很快就会太慢。

        对象的数量无关紧要,它们有多复杂。

        例如,如果是 100 张图像,与 1 个 Avatar 的 3D 模型相比将不会占用任何空间。

        在 Java 中,您可以使用 Opengl 或 Java3D

        我倾向于选择 Opengl 作为个人选择

        【讨论】:

        • 对不起,忘了说我只处理 2d 图形。我认为它暗示了“垂直射手”。我的问题已相应更改。
        • 没关系,您所做的就是设置 Opengl 或 Java 以正交显示所有内容,并且它将是“2D”,然后如果您不熟悉 Opengl,您总能找到一个可以处理的库大部分
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        相关资源
        最近更新 更多