我应该用什么来显示游戏图形?

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

重要细节:

  1. 理想帧率:25fps
  2. 这是一场2D游戏
  3. 屏幕上任何时候都有25到100个对象,所有这些对象都在移动
  4. 显示的所有对象都是图像,均为PNG格式
  5. 窗口是640px×480px
  6. 现在所有的图像都被加载为BufferedImage,虽然我可以很容易地改变它

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

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

如果Swing是可接受的,默认情况下JPanel是双缓冲的,而周期为40 ms的javax.swing.Timer将为您提供~25 Hz的更新。 此示例显示了基本方法,而此示例显示了许多运动中的图像。

附录:

我需要一个坐标平面。

让模型和视图使用不同的坐标并不罕见; 所需要的只是将一个系统映射到另一个系统的function。 在这个游戏中 ,视图依赖于将图块映射到像素的四种方法 ,反之亦然。

答案真的取决于这个游戏是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,我推荐OpenGL SuperBible(第5版) ,俗称“The Blue Book”。 代码示例都是用C ++编写的,但对于OpenGL函数,它可能只是使用包装器库的问题。 例如:

 glDrawElements(...); 

可能会变成:

 JavaGLWrapperObject.glDrawElements(...); 

不幸的是我无法给出具体的例子,因为我没有将OpenGL与Java程序一起使用,但上面的例子非常粗略地描述了如何在Android平台上使用OpenGL ES。

就性能而言…… Java的API带来了一些非常重要的开销,但我可以看到它对你的目的没有问题。 您可能需要花费更多精力来提高算法的效率,并且您的游戏可能无法在function较少的硬件上运行。 如果你决定采用OpenGL路线,它几乎肯定会更快(再次,取决于算法的效率),但相应更难学习和开始。 当然可行,但这将是一个挑战。

您有多种选择:

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

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

(Slick的目标是2D图形,而JMonkey的目标是3D并使用OpenGL – 虽然我已经研究了它们的用途,但我实际上并没有使用它们)

或者,您可以自己编码。 从事物的声音来看,这是你的第一个(图形)游戏,所以你可能想要阅读一种称为双缓冲的技术,你可以在屏幕外写下每一帧,然后将整个画面画到屏幕上,因为这可以导致动画更流畅。

为了让您进一步了解游戏开发,我强烈建议您阅读本网站,Andrew Davison博士的Java杀手游戏编程 ,因为他提供了一些很好的指导,并为新游戏开发人员提供了良好的渐进式学习途径,并且他们进入2D然后进行3D开发。

HTH

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

对象的数量是无关紧要的,它们的复杂程度是多少。

例如,如果它是100个图像,则与1个3D模型的阿凡达相比,什么都不会。

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

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