2012-12-28 44 views
0

我试图编程一个捕食者/猎物类型模拟,其中两种不同类型的代理在模拟中移动。现在我有8种可能的移动方向(右,右前,前进等)代理商可移动in.To使它看起来更自然,我想实现像这样基于角运动:模拟游戏 - 检查代理是否被阻止

xPos+= speed * Math.cos(Math.toRadians(angle)); 
yPos+= speed * Math.sin(Math.toRadians(angle)); 

我已经碰撞检测已经在模拟其中代理不能互相重叠执行。 现在我面临的问题是,如何检查我的代理是否被阻挡(被其他代理装箱),从而无法移动。以前的8方向移动我做的是我尝试移动到一个在八个可能的方向中,如果代理不能朝那个方向移动(碰撞或边界),则从可能的移动方向移除方向并再试一次。一旦没有移动方向,则表示代理已装箱。

但是,如果我要实现基于角度的移动(确实检查单个可能的移动角度是非常低效的),我该如何检查代理是否已装入,如果没有,接下来应该选择哪个角度的移动。或者,我应该只是坚持八向运动?

目前代理人正朝着最近的食物移动,否则它会自由漫游。代理人没有限制它转多快等等(现在可以马上转身)。

+1

首先,定义“代理人”的规则。例如,它应该如何移动?一个非常简单的方法就是总结所有的“威胁”(或“食物”或“信息素”)向量在附近的区域 - 这就是旅行(或撤退)的向量。当然,这就是“本地目标”矢量,它可能有其他限制,例如: “只能转得这么快”。对于更好的人工智能而言,它实际上“提前思考”会变得更复杂一些,但对于简单的捕食者/猎物游戏模拟来说,这应该是很好的。 – 2012-12-28 23:11:49

+1

(同样的方法可以用来找到“最大的开放”,将其他N个代理人视为“威胁”并试图避开它们。矢量也可以简化为网格单元或谨慎的移动) – 2012-12-28 23:15:42

+0

Ahh对不起,代理商真的可以自由漫游,对转速等没有任何限制。在它朝着它的方向移动之前,它会检查它是否与周围的任何其他代理发生碰撞(如果它正在朝那个方向移动)(或者是否它已经达到了模拟窗口的范围)。我遇到的问题是如果我使用基于角度的运动(不会与任何物体碰撞的运动),我如何选择下一个最佳可用运动角度(即代理可以移动而不碰撞或达到边界),而不必实际检查所有的360度。 – Tohmas

回答

1

只需检查角色周围的所有4个边界,就像你已经在做的一样,如果它们不可用,那么使四个对角线移动同样不可用。

+0

哦,对不起,怀疑这个问题,我遇到的真正问题是,如果代理没有被阻止,我该如何选择下一个角度来检查代理是否可以这样移动。我的意思是我可以检查所有360度但是这将会非常昂贵并且效率不高。 – Tohmas