#include "Monster.h"
USING_NS_CC;
Monster::Monster(void)
{
IsRunning=false;//没在放动画
MonsterDirecton=TRUE;//向右运动
Monster_name=NULL;
IsAttack=false;
Monster_xue=NULL;
my_hero=NULL;//当前英雄
my_map=NULL;//当前地图
dis=10000;
}
Monster::~ Monster(void)
{
}
CCSprite* Monster::GetSprite()
{
return m_MonsterSprite;
}
void Monster::InitMonsterSprite(char *name)
{
Monster_name=name;
this->m_MonsterSprite=CCSprite::create(name);
m_MonsterSprite->setFlipX(MonsterDirecton);
this->addChild(m_MonsterSprite);
}
void Monster::InitMonsterSprite(char *name,char *xue_back,char* xue_fore)
{
InitMonsterSprite(name);
//设置怪物的血条
Monster_xue = new ProgressView();
if(MonsterDirecton)//因为怪物中心不在图片中心,所以只能根据怪物的脸朝向,设置血条的横坐标
Monster_xue->setPosition(ccp(m_MonsterSprite->getPositionX()+20, m_MonsterSprite->getPositionY()+50));//设置在怪物上头
else
Monster_xue->setPosition(ccp(m_MonsterSprite->getPositionX()-20, m_MonsterSprite->getPositionY()+50));
Monster_xue->setBackgroundTexture(xue_back);
Monster_xue->setForegroundTexture(xue_fore);
Monster_xue->setTotalProgress(300.0f);
Monster_xue->setCurrentProgress(300.0f);
this->addChild(Monster_xue);
}
void Monster::SetAnimation(const char *name_each,unsigned int num,bool run_directon)
{
if(MonsterDirecton!=run_directon)
{ MonsterDirecton=run_directon;
m_MonsterSprite->setFlipX(run_directon);
}
if(IsRunning||IsAttack)
return;
CCAnimation* animation = CCAnimation::create();
for( int i=1;i<=num;i++)
{
char szName[100] = {0};
sprintf(szName,"%s%d.png",name_each,i);
animation->addSpriteFrameWithFileName(szName); //加载动画的帧
}
animation->setDelayPerUnit(2.8f / 14.0f);
animation->setRestoreOriginalFrame(true);
animation->setLoops(-1); //动画循环
//将动画包装成一个动作
CCAnimate* act=CCAnimate::create(animation);
m_MonsterSprite->runAction(act);
IsRunning=true;
}
void Monster::StopAnimation()
{
if(!IsRunning)
return;
m_MonsterSprite->stopAllActions();//当前精灵停止所有动画
//恢复精灵原来的初始化贴图
this->removeChild(m_MonsterSprite,TRUE);//把原来的精灵删除掉
m_MonsterSprite=CCSprite::create(Monster_name);//恢复精灵原来的贴图样子
m_MonsterSprite->setFlipX(MonsterDirecton);
this->addChild(m_MonsterSprite);
IsRunning=false;
//存在血条
if(Monster_xue!=NULL)
{
if(MonsterDirecton)//因为怪物中心不在图片中心,所以只能根据怪物的脸朝向,设置血条的横坐标
Monster_xue->setPosition(ccp(m_MonsterSprite->getPositionX()+20, m_MonsterSprite->getPositionY()+50));//设置在怪物上头
else
Monster_xue->setPosition(ccp(m_MonsterSprite->getPositionX()-20, m_MonsterSprite->getPositionY()+50));
}
}
void Monster::AttackAnimation(const char *name_each,const unsigned int num,bool run_directon)
{
if(IsAttack||IsRunning)
return;
CCAnimation* animation = CCAnimation::create();
for( int i=1;i<=num;i++)
{
char szName[100] = {0};
sprintf(szName,"%s%d.png",name_each,i);
animation->addSpriteFrameWithFileName(szName); //加载动画的帧
}
animation->setDelayPerUnit(2.8f / 14.0f);
animation->setRestoreOriginalFrame(true);
animation->setLoops(1); //动画循环1次
//将动画包装成一个动作
CCAnimate* act=CCAnimate::create(animation);
//创建回调动作,攻击结束后调用AttackEnd()
CCCallFunc* callFunc=CCCallFunc::create(this,callfunc_selector(Monster::AttackEnd));
//创建连续动作
CCActionInterval* attackact=CCSequence::create(act,callFunc,NULL);
m_MonsterSprite->runAction(attackact);
IsAttack=true;
}
void Monster::AttackEnd()
{
//恢复精灵原来的初始化贴图
this->removeChild(m_MonsterSprite,TRUE);//把原来的精灵删除掉
m_MonsterSprite=CCSprite::create(Monster_name);//恢复精灵原来的贴图样子
m_MonsterSprite->setFlipX(MonsterDirecton);
this->addChild(m_MonsterSprite);
IsAttack=false;
}
void Monster::FollowRun(CCNode* m_hero,CCNode* 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->setFlipX(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->setFlipX(MonsterDirecton);//设置方向
if(IsAttack)
return;
this->setPosition(this->getPositionX()+1,this->getPositionY());
this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画
}
else if(x<=100)//怪物橫坐標和英雄相差在100以内时,开始移动怪物纵坐标
{
if(m_hero->getPositionY()>this->getPositionY())
{
m_MonsterSprite->setFlipX(MonsterDirecton);//设置方向
if(IsAttack)
return;
this->setPosition(this->getPositionX(),this->getPositionY()+1);
this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画
}
else if(m_hero->getPositionY()<this->getPositionY())
{
m_MonsterSprite->setFlipX(MonsterDirecton);//设置方向
if(IsAttack)
return;
this->setPosition(this->getPositionX(),this->getPositionY()-1);
this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画
}
}
}
void Monster::JudegeAttack()
{
srand((UINT)GetCurrentTime());
int x = rand()%100;
if(x>98)
{
this->AttackAnimation("monster_attack",5,MonsterDirecton);
}
}
void Monster::MonsterSeeRun()
{
if(dis<300)
return;
this->SetAnimation("monster_run",6,MonsterDirecton);//播放动画
CCMoveBy *moveby1;
if(MonsterDirecton==true)
moveby1=CCMoveBy::create(2,ccp(-100,0));
else
moveby1=CCMoveBy::create(2,ccp(100,0));
//创建回调动作,巡逻路线完后
CCCallFunc* callFunc=CCCallFunc::create(this,callfunc_selector(Monster::StopAnimation));
//创建连续动作
CCActionInterval* xunluo=CCSequence::create(moveby1,callFunc,NULL);
this->runAction(xunluo);
}
//启动监听
void Monster::StartListen(CCNode* m_hero,CCNode* 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) + pow(y,2));
if(dis>=300)
{
if(!IsRunning)
MonsterSeeRun();
}
}
void Monster::update(float delta)
{
if(dis<300)///当英雄在它的可视范围内,不断追着英雄
FollowRun(my_hero,my_map);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Cocos2d-x 怪物智能AI怪物也有智商----之游戏开发《赵云要格斗》(6)的源代码,实现智能怪物AI的设计和编程,不懂的地方可以看我博客 这是文章的地址http://blog.csdn.net/evankaka/article/details/42611031
资源推荐
资源详情
资源评论
收起资源包目录
cocos2dx -怪物智能AI怪物也有智商----《赵云要格斗》 (270个子文件)
ResolveAssemblyReference.cache 2KB
Monster.cpp 7KB
HRocker.cpp 4KB
HelloWorldScene.cpp 4KB
ControlButton.cpp 4KB
Hero.cpp 3KB
ProgressView.cpp 2KB
AppDelegate.cpp 1KB
Map.cpp 855B
main.cpp 591B
wc.db 48KB
libExtensions.dll 3.05MB
libcocos2d.dll 2.44MB
libcocos2d.dll 1.44MB
libExtensions.dll 1.28MB
libcurl.dll 1.13MB
libcurl.dll 1.13MB
iconv.dll 868KB
iconv.dll 868KB
libCocosDenshion.dll 613KB
sqlite3.dll 527KB
sqlite3.dll 527KB
libtiff.dll 513KB
libtiff.dll 513KB
libCocosDenshion.dll 409KB
glew32.dll 324KB
glew32.dll 324KB
pthreadVCE2.dll 76KB
pthreadVCE2.dll 76KB
zlib1.dll 76KB
zlib1.dll 76KB
websockets.dll 76KB
websockets.dll 76KB
entries 3B
HelloCpp.exe 95KB
HelloCpp.exe 38KB
libcocos2d.exp 1.01MB
libcocos2d.exp 1.01MB
libExtensions.exp 1023KB
libExtensions.exp 1023KB
libCocosDenshion.exp 348KB
libCocosDenshion.exp 348KB
HelloCpp.vcxproj.filters 3KB
format 3B
AppMacros.h 3KB
ControlButton.h 2KB
Monster.h 2KB
HRocker.h 1KB
Hero.h 998B
AppDelegate.h 955B
ProgressView.h 870B
HelloWorldScene.h 649B
Map.h 541B
main.h 267B
vc100.idb 2.75MB
libExtensions.ilk 8.73MB
HelloCpp.ilk 1.22MB
background_1.jpg 277KB
HelloCpp.lastbuildstate 98B
HelloCpp.lastbuildstate 96B
libBox2D.lib 2.3MB
libBox2D.lib 1.74MB
libcocos2d.lib 1.65MB
libcocos2d.lib 1.65MB
libExtensions.lib 1.64MB
libExtensions.lib 1.64MB
libchipmunk.lib 1.09MB
libchipmunk.lib 812KB
libCocosDenshion.lib 560KB
libCocosDenshion.lib 560KB
libwebp.lib 533KB
libwebp.lib 533KB
glew32.lib 500KB
glew32.lib 500KB
libpng.lib 321KB
libpng.lib 321KB
libjpeg.lib 263KB
libjpeg.lib 263KB
sqlite3.lib 48KB
sqlite3.lib 48KB
libtiff.lib 35KB
libtiff.lib 35KB
pthreadVCE2.lib 29KB
pthreadVCE2.lib 29KB
websockets.lib 17KB
websockets.lib 17KB
libcurl_imp.lib 13KB
libcurl_imp.lib 13KB
libzlib.lib 13KB
libzlib.lib 13KB
libiconv.lib 3KB
libiconv.lib 3KB
HelloCpp.Build.CppClean.log 9KB
HelloCpp.log 5KB
HelloCpp.log 1KB
HelloCpp.exe.embed.manifest 406B
HelloCpp.exe.intermediate.manifest 381B
HelloCpp.exe.intermediate.manifest 381B
HelloWorldScene.obj 1.61MB
AppDelegate.obj 1.6MB
共 270 条
- 1
- 2
- 3
Evankaka
- 粉丝: 7702
- 资源: 129
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页