Cocos2d-X 3.4版-怪物的AI《赵云要格斗》

Cocos2d-X 3.4版-怪物的AI《赵云要格斗》,第1张

概述引述Evankaka博客关于怪物AI的描述,如下: 低级怪物---一般是不能动的怪物,固定在原处,不断的发动攻击,然后根据英雄的方位,不断改变子d的朝左还是朝向,如游戏中的炮台等。         中级怪物----初步有一些智商了,主要表现在当英雄在它的攻击范围内,能够知道英雄的位置,就以一定的比例判断是否进行攻击。如若不然,平时都是自己按照一定的路线进行行走,又或者是随机走动。然后攻击随机出动,

引述Evankaka博客关于怪物AI的描述,如下:

低级怪物---一般是不能动的怪物,固定在原处,不断的发动攻击,然后根据英雄的方位,不断改变子d的朝左还是朝向,如游戏中的炮台等。

中级怪物----初步有一些智商了,主要表现在当英雄在它的攻击范围内,能够知道英雄的位置,就以一定的比例判断是否进行攻击。如若不然,平时都是自己按照一定的路线进行行走,又或者是随机走动。然后攻击随机出动,只有当英雄在它的攻击范围内,它才会不再走动,原地以概率判断是否要进行攻击

高级怪物-----BOSS级怪物,它有自己的可视范围区,当英雄陷入它的可视范围区时,它就追着英雄跑。可视范围区内,还有个攻击范围区,当英雄陷入攻击范围区内时,怪物就按一定的概率出动攻击,这个概率一般比较大。然后,如果英雄不在怪物的可视范围区内时,怪物它有自己的巡逻路线,它按照这个路线不断的走,总会发现到英雄,英雄你再怎么跑,它都会跟着你。


主要是通过怪物与玩家的位置关系才去不同的策略,主要功能通过以下的方法实现:

//在可视范围内,怪物跟随英雄运动	voID FollowRun(Node* m_hero,Node* m_map);	//判断是否攻击	voID JudegeAttack();	//怪物巡逻路线	voID MonsterSeeRun();    	//怪物启动监听英雄	voID StartListen(Node* m_hero,Node* m_map);	//监听函数,每隔3秒检测下,计算英雄与怪物的距离	voID updateMonster(float delta);	//更新函数,如果英雄在可视范围内,不断触发	voID update(float delta);

Node* my_hero;//当前英雄	Node* my_map;//当前地图	float   dis;//当前怪物和英雄的距离
函数实现部分:
voID Monster::FollowRun(Node* m_hero,Node* m_map){	//得到两点x的距离,记得怪物的坐标要加上地图的	float x = m_hero->getpositionX()-(this->getpositionX()+m_map->getpositionX());	//得到两点y的距离,记得怪物的坐标要加上地图的	float y = m_hero->getpositionY()-(this->getpositionY()+m_map->getpositionY());        //先计算怪物和英雄的距离	dis = sqrt(pow(x,2) + pow(y,2));    	if(dis>=300)//当怪物与英雄距离超过300		return;	if(dis<=100)//在怪物攻击范围内,怪物停止移动	{		this->StopAnimation();//停止跑动		JudegeAttack();//以一定的概率判断是是否出动攻击		return;	}    	if(x<-100)//判断怪物横坐标和英雄的距离    {                MonsterDirecton=true;        m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向        if(IsAttack)            return;        this->setposition(this->getpositionX()-1,this->getpositionY());//怪物向英雄移动        this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画        	}	else if(x>100)    {        MonsterDirecton=false;        m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向        if(IsAttack)            return;        this->setposition(this->getpositionX()+1,this->getpositionY());        this->SetAnimation("monster_run",MonsterDirecton);//播放动画    }	else if(x<=100 || x >-100)//怪物橫坐標和英雄相差在100以内时,开始移动怪物纵坐标	{        		if(m_hero->getpositionY()>this->getpositionY())		{			m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向			if(IsAttack)				return;			this->setposition(this->getpositionX(),this->getpositionY()+1);            this->SetAnimation("monster_run",MonsterDirecton);//播放动画		}		else if(m_hero->getpositionY()<this->getpositionY())		{			m_MonsterSprite->setFlippedX(MonsterDirecton);//设置方向			if(IsAttack)				return;			this->setposition(this->getpositionX(),this->getpositionY()-1);			this->SetAnimation("monster_run",MonsterDirecton);//播放动画		}	}    }voID Monster::JudegeAttack(){	//srand(time(NulL));	int x = random(0,100);    log("-------%d",x);	if(x>50)	{        this->AttackAnimation("monster_attack",5,MonsterDirecton);	}    }voID  Monster::MonsterSeeRun(){	if(dis<300)		return;    this->SetAnimation("monster_run",MonsterDirecton);//播放动画    MoveBy *moveby1;    if(MonsterDirecton==true)        moveby1=MoveBy::create(1,Vec2(-70,0));    else        moveby1=MoveBy::create(1,Vec2(70,0));	//创建回调动作,巡逻路线完后//	auto callFunc=CallFunc::create(this,callfunc_selector(Monster::StopAnimation));    auto callFunc = CallFunc::create( CC_CALLBACK_0(Monster::StopAnimation,this));	//创建连续动作	auto xunluo=Sequence::create(moveby1,callFunc,NulL);	this->runAction(xunluo);}//启动监听voID Monster::StartListen(Node* m_hero,Node* m_map){    my_hero=m_hero;    my_map=m_map;	this->schedule(schedule_selector(Monster::updateMonster),3.0f);//每隔3秒计算距离	this->scheduleUpdate();//英雄一旦进入可视范围,怪物追着英雄打}//监听函数,每隔3秒检测下voID Monster::updateMonster(float delta){	//得到两点x的距离,记得怪物的坐标要加上地图的	float x = my_hero->getpositionX()-(this->getpositionX()+my_map->getpositionX());	//得到两点y的距离,记得怪物的坐标要加上地图的	float y = my_hero->getpositionY()-(this->getpositionY()+my_map->getpositionY());	//先计算怪物和英雄的距离	dis = sqrt(pow(x,2));	if(dis>=300)	{		if(!IsRunning)            MonsterSeeRun();	}}voID Monster::update(float delta){	if(dis<300)///当英雄在它的可视范围内,不断追着英雄        FollowRun(my_hero,my_map);}
对于这一块的讲解Evakaka已经讲的非常明白的了,只不过我第一次看见这句的时候也有点小小的疑惑
//得到两点x的距离,2));
为什么要加上地图的坐标呢,我想表达式要是写成这样会更清晰一些:
//得到两点x的距离,记得怪物的坐标要加上地图的	float x = (m_hero->getpositionX()+m_map->getpositionX())-this->getpositionX();	//得到两点y的距离,记得怪物的坐标要加上地图的	float y = (m_hero->getpositionY()+m_map->getpositionY())-(this->getpositionY());        //先计算怪物和英雄的距离	dis = sqrt(pow(x,2));
当hero移动的屏幕一般的时候,hero就只是做移动的动作,而真正移动的是map,所以如果仅仅比较hero和monster的

距离,肯定是要出错的。

工程下载...

PS:多写博客,帮助自己,方便他人!

总结

以上是内存溢出为你收集整理的Cocos2d-X 3.4版-怪物的AI《赵云格斗》全部内容,希望文章能够帮你解决Cocos2d-X 3.4版-怪物的AI《赵云要格斗》所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1037532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存