在小规模RTS中实施单位的最佳方式?

时间:2013-05-08 20:43:06

标签: java implementation 2d-games

我目前正在开发一种Java中的小规模2D RTS,它对任何非标准库都是不可靠的。

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

我想到了两种方式:

1)将它们作为线程实现。由于线程与单元一样,具有生命周期并独立运行,因此它们应该是合适的。

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

我正在考虑给每个单位子线程处理这个(再次,因为它们应该是独立但并发的),但我担心这是一种低效的方法。我不受程序中计算限制的限制,但我想知道处理未来开发的最佳方法。

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

问题:可能导致笨重的代码?

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

总结一下我的问题:我应该使用线程,定时器或其他方法来实现用Java编码的小型RTS中的单元吗?任何意见都将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

我更喜欢你的第二种方法,每个单位每回合做一次动作。如果你将转弯切成足够小的切片,这将没有问题。

你能做的一件事就是让“背景代码”与你的第二种方法(基于快速转弯)一起运行,对于“重要的”单位统计数据(HP,position,moveFlag,attackFlag,deathAnimationFlag等)。然后,有一个单独的线程用于动画,可以“轮询”或“订阅”单位的位置和状态来绘制正在发生的事情。如果绘制线程略微滞后于统计线程一毫秒,没问题,对吗?

答案 1 :(得分:0)

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

  1. 建筑+收割机=我的
  2. Building + BuildingSite =建筑工地
  3. Building + Constructor = Barracks
  4. Unit + Gatherer = resource gatherer
  5. Unit + Constructor + Gathener =也可以建造建筑物的工人
  6. 逻辑循环应如下所示:

    1. 游戏循环调用逻辑核心的“更新”方法
    2. 逻辑核心正在调用列表上每个实体的“更新”方法
    3. 实体正在调用列表
    4. 上每个属性的“更新”方法
    5. 财产正在完成其余的工作
    6. 实体不应该是硬编码的,我建议从外部文件中加载它们。

答案 2 :(得分:0)

追求选项2

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