初入社会戏人生(五)-游戏中的AI

本文介绍了3D坦克大战中AI坦克的设计,重点探讨了巡逻状态和战斗状态。坦克的移动路线、可视范围以及如何检测敌方坦克进入视野。使用状态设计模式来控制AI坦克的行为,每个状态类作为单独的类实现,便于扩展。文章还讨论了State基类的设计,包括Enter和Exit函数,以及状态子类采用单例模式的益处。
摘要由CSDN通过智能技术生成

06/16/2020

基础介绍

最近在做关于3D坦克大战的AI, 我们打算做一个简单的AI坦克,这个坦克只有巡逻和战斗状态

巡逻状态

坦克移动路线

简单的行动路线,给定一个移动距离,前后移动这个坦克。

坦克可视范围(半径和角度)

通常坦克的扫视范围是根据炮台的朝向画圆,半径和扫过的角度可以自由决定,如果敌方坦克进入这个范围,AI坦克将会发现它。那么如何检测其他坦克进入AI坦克的扫视范围呢?

已知量

  • 其他坦克的位置
  • 自身坦克的位置
  • 自身坦克炮台的朝向和扫视角度(弧度制表示)
struct AiTank
{
   
	Vector3 position;
	Vector3 orientation;		//Ai炮台的朝向
	float scanRadius = 10.0f;
	float scanRadian = 3.14/8; //弧度制表示 正负 180度/8
};
判断依据
  • 两坦克的位置求距离公式与扫视半径比较
  • AI坦克的炮台的正面朝向和AI到目标坦克的夹角与扫视角度比较
    • 点乘可以计算两个向量的夹角,并判断是否在扫射角度里还是角度外
    • 点乘为正,锐角,0为直角,负数为钝角,值越大表示锐角越小
    • 注意:点乘是不分先后顺序的,即 a ⋅ b = b ⋅ a a \cdot b = b \cdot a ab=ba
//伪代码
bool findEnemy(const AiTank& aiTank,const Tank& target){
   
	Vector3 pointToTarget = target.position - aiTank.position;
	float distance = Vector3Length(pointToTarget);
	if(distance <= scanRadius) // 距离判断,在扫视半径的圆内
	{
   
		float cosValue = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值