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

时间:2011-06-06 01:13:38

标签: java graphics

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

重要细节:

  1. 理想帧率:25fps
  2. 这是一场2D游戏
  3. 屏幕上任何时候都有25到100个对象,所有这些对象都在移动
  4. 所有正在显示的对象都是图片,全部为PNG格式
  5. 窗口为640px×480px
  6. 现在所有的图像都被加载为BufferedImage,虽然我可以很容易地改变这个
  7. 7。我需要一个坐标平面。如果不完全重构代码,这是唯一无法改变的基本部分。

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

4 个答案:

答案 0 :(得分:4)

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

  

我需要一个坐标平面。

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

答案 1 :(得分:3)

您可以使用多种选项:

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

  1. JMonkeyEngine(http://jmonkeyengine.com/)
  2. Slick(http://slick.cokeandcode.com/index.php)
  3. (Slick的目标是2D图形,而JMonkey的目标是3D并使用OpenGL - 虽然我已经研究了它们的用途,但我自己并没有实际使用过它们)

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

    为了让您进一步了解游戏开发,我强烈建议您阅读本网站,Killer Game Programming in Java由Andrew Davison博士提供一些好的指示,同时也为新游戏开发者提供了良好的渐进式学习途径,并将它们移动到2D然后进行3D开发。

    HTH

答案 2 :(得分:2)

答案实际上取决于这款游戏是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),通常称为“The Blue Book”。  代码示例都是用C ++编写的,但对于OpenGL函数,它可能只是使用包装器库的问题。例如:

glDrawElements(...);

可能会成为:

JavaGLWrapperObject.glDrawElements(...);

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

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

答案 3 :(得分:0)

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

对象的数量无关紧要,它们的复杂程度如何。

如果它是100个图像,则与1个3D模型的阿凡达相比,将无需任何操作。

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

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