Java 2D游戏 - 计时器与线程?

时间:2011-10-17 02:53:42

标签: java multithreading timer

嘿伙计们我正在制作我的第一个2D Java游戏,我目前正在使用Timers来控制和更新所有内容。我想知道什么方法最适合2D Java游戏,计时器或线程?目前我的gameCanvas类中有一个Timer,它可以渲染/绘制所有内容以及检查碰撞。我还为我的播放器配备了一个Timer,用于移动他。

我使用计时器的唯一原因是因为我是Java编程的新手,当时我认为所有必须放的是最简单的方法:

Timer timer = new Timer(5,this);
timer.start();

你们会推荐什么?

2 个答案:

答案 0 :(得分:4)

关于这两种方法的利弊的说法是完全正确的。

但是,我也不建议。我会使用一个“专为游戏设计”的游戏引擎,例如Slick2D,它将极大地帮助你完成游戏中的更新和逻辑,主游戏循环的结构,以及照顾很多您将遇到的低级问题。

如果您正考虑将Swing用于游戏,我也会远离这一点,原因如in my answer here所述。

Slick2D是预先构建的,用于处理时间问题,并计算渲染帧之间的增量等。您还可以获得许多不需要自己构建的好东西,例如作为输入处理(键盘,鼠标,控制器),加速图形(您的游戏将自动受益于图形加速,因为引擎会为您完成此操作),当您为音频做好准备时,它还有一个很棒的音频库。

自己写这些东西会让你想哭。除非您真正构建引擎本身(而不是想花时间构建游戏逻辑本身),否则构建引擎需要花费大量时间才能使用现成的成熟工具。

答案 1 :(得分:2)

这取决于游戏类型。

对于“快速游戏”(例如射击游戏),具有产量/等待(视情况而定)的专用游戏循环(可能在线程中)通常将最佳地起作用。对于“慢速游戏”,计时器可以正常工作 - 但是,两种类型的计时器:

  1. 一个“摇摆”计时器(javax.swing.Timer)
    1. 优点:在EDT上运行,因此可以触摸Swing / AWT对象
    2. 缺点:在EDT上运行,因此分辨率和时间保证
  2. “服务”计时器(java.util.Timer)
    1. 的优点:
      1. 支持“固定费率”计时器
      2. 在自己的线程上运行(因此分辨率/一致性更好,但不能保证)
    2. 缺点:不能在EDT上运行(因此无法触摸Swing / AWT)。
  3. 很多情况下游戏必须计算最后一次事件发生时和当前事件发生时的“delta”,并在计算中使用它。如果没有使用delta的模型,游戏速度将因系统而异。

    就个人而言,我建议LWJGL: Lightweight Java Game Library提供一个非常适合“快速游戏”循环的高分辨率时钟。它还支持“直接”OpenGL绑定; - )

    我没有任何开发“慢游戏”的经验。

    快乐的编码。