0

我目前正在用 Java 开发一个不依赖任何非标准库的小型 2D RTS。

我无法正确回答的一个关键问题是如何实现这些单元,以便它们中的每一个独立运行,这在 RTS 中是正常的。

我想到了两种方法:

1)将它们实现为线程。由于线程与单元非常相似,具有生命周期并独立运行,因此它们应该很合适。

问题:我如何保持单位 AI 的其他重要方面,例如瞄准和攻击敌人或在移动时为空闲动画旋转炮塔?

我正在考虑让每个单元子线程来处理这个问题(同样,因为它们应该是独立但并发的),但我担心这是一种低效的方法。我不受程序中计算限制的限制,但我想知道处理事情的最佳方式以供未来发展。

2)“转身”。每个单元都有一组在每个回合中应该考虑执行的动作,并且回合由迭代所有现有单元的非常快的 TimerTasks 触发。

问题:可能会导致代码笨拙?

我倾向于第一种方法,但在我深入研究之前,我想知道我是否朝着正确的方向前进,或者我是否更有可能射中自己的脚。

总结一下我的问题:我应该使用线程、计时器还是其他方法来实现用 Java 编码的小型 RTS 中的单元?任何输入将不胜感激。

4

3 回答 3

1

在单独的线程中实现它们可能会导致竞争条件,除非您希望将特定单元绑定到它碰巧运行的任何核心,否则我会远离这个。

我更喜欢你的第二种方法,每个单位每回合都做自己的动作。如果你把它们切成足够小的片,这不会给你带来任何问题。

您可以做的一件事是让“背景代码”使用您的第二种方法(基于非常快速的转弯)运行,用于“重要”单位统计信息(HP、位置、moveFlag、attackFlag、deathAnimationFlag 等)。然后,有一个单独的线程用于动画,可以“轮询”或“订阅”单元的位置和状态以绘制正在发生的事情。如果绘图线程稍微落后于统计线程一毫秒,没问题,对吧?

于 2013-05-08T20:54:32.253 回答
0

为每个实体使用单独的线程是非常非常糟糕的主意 - 我认为最好的方法应该是在游戏核心中添加实体(单位、建筑物等)列表。每个实体都应该由“块”组成 - 模块告诉这个实体可以做什么(实体属性)。例如:

  1. 建筑+收割机=我的
  2. 建筑+建筑工地=建筑工地
  3. 建筑+建造者=兵营
  4. 单位+收集者=资源收集者
  5. Unit+Constructor+Gatherer = 可以建造建筑的工人

逻辑循环应该是这样的:

  1. 游戏循环正在调用逻辑核心的“更新”方法
  2. 逻辑核心正在调用列表中每个实体的“更新”方法
  3. 实体正在调用列表中每个属性的“更新”方法
  4. 财产正在做剩下的工作

实体不应该被硬编码,我建议从外部文件加载它们。

于 2013-05-08T21:04:49.483 回答
0

选择选项 2

你可以每 100 毫秒转一圈,然后重新计算单位的位置,25 毫秒会给你 40 fps,这将是一个很好的开始,我认为开始非常好

于 2013-05-08T21:32:52.623 回答