我目前正在开发一种Java中的小规模2D RTS,它对任何非标准库都是不可靠的。
我无法正确回答的一个关键问题是如何实现这些单元,使每个单元独立运行,这在RTS中是正常的。
我想到了两种方式:
1)将它们作为线程实现。由于线程与单元一样,具有生命周期并独立运行,因此它们应该是合适的。
问题:如何保持单位人工智能的其他重要方面,例如瞄准和攻击敌人,或者在移动时为空闲动画旋转炮塔?
我正在考虑给每个单位子线程处理这个(再次,因为它们应该是独立但并发的),但我担心这是一种低效的方法。我不受程序中计算限制的限制,但我想知道处理未来开发的最佳方法。
2)“Turns”。每个单位都有一套它应该考虑在每个回合中执行的动作,并且轮转由非常快速的TimerTasks触发,迭代所有现有单位。
问题:可能导致笨重的代码?
我倾向于第一种方法,但在我深入研究之前,我想知道我是否正确地前进,或者我是否更有可能用脚射击自己。
总结一下我的问题:我应该使用线程,定时器或其他方法来实现用Java编码的小型RTS中的单元吗?任何意见都将不胜感激。
答案 0 :(得分:1)
在单独的线程中实现它们可能会导致竞争条件,除非您希望特定单元与其碰巧运行的任何核心绑定,否则我将远离此。
我更喜欢你的第二种方法,每个单位每回合做一次动作。如果你将转弯切成足够小的切片,这将没有问题。
你能做的一件事就是让“背景代码”与你的第二种方法(基于快速转弯)一起运行,对于“重要的”单位统计数据(HP,position,moveFlag,attackFlag,deathAnimationFlag等)。然后,有一个单独的线程用于动画,可以“轮询”或“订阅”单位的位置和状态来绘制正在发生的事情。如果绘制线程略微滞后于统计线程一毫秒,没问题,对吗?
答案 1 :(得分:0)
为每个实体使用单独的线程确实非常糟糕 - 我认为最好的方法应该是在游戏核心中添加实体(单位,建筑物等)列表。每个实体都应该由“块”构成 - 模块告诉这个实体可以做什么(实体属性)。例如:
逻辑循环应如下所示:
实体不应该是硬编码的,我建议从外部文件中加载它们。
答案 2 :(得分:0)
追求选项2
你可以每100ms转一圈,然后重新计算单位的位置,25ms会给你40fps,这将是一件好事,我认为开始是非常好的