【Cocos游戏实战】功夫小子第二课之基础类分析和实现

// 受伤void Hero::HurtByMonsterAnimation(const char *name_each, float delay, bool run_directon){if (IsHurt || IsDead)return;//受伤优先if (IsRunning || IsAttack){m_HeroSprite->stopAllActions();//当前精灵停止所有动画//恢复精灵原来的初始化贴图 this->removeChild(m_HeroSprite, true);//把原来的精灵删除掉m_HeroSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Hero_name));//恢复精灵原来的贴图样子m_HeroSprite->setFlippedX(HeroDirecton);this->addChild(m_HeroSprite);IsRunning = false;IsAttack = false;}Animate* action = ActionTool::animationWithFrameName(name_each, 1, delay);//创建回调动作,受伤动画结束调用HurtEnd()CallFunc* callFunc = CallFunc::create(this, callfunc_selector(Hero::HurtByMonsterEnd));//创建连续动作ActionInterval* hurtackact = Sequence::create(action, callFunc, NULL);m_HeroSprite->runAction(hurtackact);IsHurt = true;}// 受伤结束void Hero::HurtByMonsterEnd(){m_iCurrentHp -= 20.0f;IsHurt = false;percentage = m_iCurrentHp / m_iTotleHp * 100.0f;if (m_iCurrentHp < 0.0f){DeadAnimation("dead", 0, HeroDirecton);}}// 死亡void Hero::DeadAnimation(const char *name_each, float delay, bool run_directon){m_HeroSprite->stopAllActions();// 调整方向if (HeroDirecton != run_directon){HeroDirecton = run_directon;m_HeroSprite->setFlippedX(run_directon);}// 创建动作Animate* act = ActionTool::animationWithFrameName(name_each, 1, delay);//创建回调动作,攻击结束后调用AttackEnd()CallFunc* callFunc = CallFunc::create(this, callfunc_selector(Hero::DeadEnd));//创建连续动作ActionInterval* attackact = Sequence::create(act, callFunc, NULL);m_HeroSprite->runAction(attackact);Director::getInstance()->getScheduler()->setTimeScale(0.5);}// 死亡结束void Hero::DeadEnd(){IsDead = true;//恢复死亡的样子this->removeChild(m_HeroSprite, true); //把原来的精灵删除掉m_HeroSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("monsterDie6.png")); //恢复死亡的样子m_HeroSprite->setFlippedX(HeroDirecton);this->addChild(m_HeroSprite);}// 判断位置bool Hero::JudgePositosn(Size visibleSize){if (this->getPositionX() > (visibleSize.width / 2.0 + 2.0) || (this->getPositionX() < visibleSize.width / 2.0 – 2.0)) // 精灵到达mid?return false;elsereturn true;//到达中间位置}怪物类的分析和实现

分析的步骤和上面分析英雄类的是一样的,不同的一部分是我们游戏中的怪物要有一定的AI,关于AI的如何设计这里不详细的展开细说了,而且这里所实现的是十分基础和简单的AI(或者不能称之为AI),设定一个全屏的仇恨范围,怪物在自己活着或者英雄或者的状态下会一直尝试跟随英雄并尝试攻击英雄。具体的AI设计大家可以自行Google或者看视频中的一部分讲解。

贴出一些关键部分的代码:

public:Monster(void);~Monster(void);// 公有属性// 怪物种类int m_iType;//判断是否在跑动画bool IsRunning;//判断是否在攻击动画bool IsAttack;//判断是否在受伤动画bool IsHurt;//判断是否死亡bool Isdead;//怪物运动的方向bool MonsterDirecton;// 方法// 根据图片名创建怪物,不带血条的怪物void InitMonsterSprite(char *name, char *a, char *die, char *walk, char *dieLast, int m_iLevel);//返回英雄Sprite* GetSprite();//设置走动动画,num为图片数目,run_directon为精灵脸朝向,false朝右,name_each为name_png中每一小张图片的公共名称部分void SetAnimation(const char *name_each, bool run_directon, float delay, int iLoops);//停止走动动画void StopAnimation();//攻击动画void AttackAnimation(const char *name_each, bool run_directon, float delay, int iLoops);//攻击动画结束void AttackEnd();//受伤动画void HurtAnimation(const char *name_each, bool run_directon, float delay, int iLoops);//受伤动画结束void HurtEnd();//死亡动画void DeadAnimation(const char *name_each, bool run_directon, float delay, int iLoops);//死亡动画结束void DeadEnd();//怪物死亡闪烁结束void BlinkEnd();//在可视范围内,怪物跟随英雄运动void FollowRun(Hero* m_hero, GameMap* m_map);//判断是否攻击void JudegeAttack(float dt);//怪物启动监听英雄void StartListen(Hero* m_hero, GameMap* m_map);//监听函数,每隔3秒检测下,计算英雄与怪物的距离void updateMonster(float delta);//更新函数,如果英雄在可视范围内,不断触发void update(float delta);CREATE_FUNC(Monster);private:Sprite* m_MonsterSprite;// 怪物精灵char *Monster_name;// 用来保存初始状态的精灵图片名称char *Monster_a;// 怪物攻击帧char *Monster_die;// 死亡帧char *Monster_walk;// 行走帧char *Die_name;Hero* my_hero;// 当前英雄GameMap* my_map;// 当前地图float dis;// 当前怪物和英雄的距离int m_iHP;这里具体实现部分代码可以参考?id=2242

上面的代码质量很差,实现的方式也很基础,仅提供给大家一个实现的参考,希望想学习的朋友能够自己思考,,不断改进和求精,写出完全属于自己的代码。

想要观看的视频,请戳这里:第二课在此,如果本教程有帮助带您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,会员可以无限制的下载和观看所有的视频,谢谢您的支持!

人生不能缺乏的是雨夜--淅沥地,独自的雨夜。这样的雨夜里,

【Cocos游戏实战】功夫小子第二课之基础类分析和实现

相关文章:

你感兴趣的文章:

标签云: