功夫小子实践开发-英雄实体类的基本分析和实现

来源:互联网 发布:武汉纵横网络 编辑:程序博客网 时间:2024/04/29 15:44
*图片来源见水印

进行的基本步骤是:
  • •确定主角所具有的属性
  • •确定主角所具有的方法
  • •编码实现主角英雄类
首先是英雄的一些基本属性,包括

而具有的方法则分为:
代码如下:

.h文件

#ifndef Hero_H__#define Hero_H__#include "cocos2d.h"USING_NS_CC;class Hero : public Node//直接继承自Sprite也行{public://属性bool IsDead;//HP & MP 值float m_iCurrentHp;//当前血量float m_iTotleHp;//总血量float m_iCurrentMp;//当前能量float m_iTotleMp;//总能量float percentage;//当前血量比float m_iSpeed;//移动速度bool m_bIsAction;//是否已经开始打怪了bool m_bIsJumping;//跳跃标志bool IsRunning;bool IsAttack;bool IsHurt;bool HeroDirection;//英雄运动的方向bool m_bCanCrazy;//狂暴标志//构造性方法//根据图片名创建英雄void InitHeroSprite(char *hero_name, int iLevel);//返回当前英雄Sprite* GetSprite();CREATE_FUNC(Hero);//动作方法//设置动画,run_dirction为精灵朝向,false朝右,frameName为图片帧名字void SetAnimation(const char *frameName, float delay, bool run_direction);void StopAnimation();void JumpUpAnimation(const char *name_each, float delay, bool run_direction);void JumpDownAnimation(const char *name_each, float delay, bool run_direction);void JumpEnd();void AttackAnimation(const char *name_each, float delay, bool run_direction);void AttackEnd();void DeadAnimation(const char *name_each, float delay, bool run_direction);void DeadEnd();void HurtByMonsterAnimation(const char *name_each, float delay, bool run_direction);void HurtByMonsterEnd();bool JudgePosition(Size visibleSize);private:Sprite* m_HeroSprite;//精灵char *Hero_name;//用来保存初始状态的精灵图片名称,每次完成动作之后都要回到这个初始不动的状态};#endif

.cpp文件

#include "Hero.h"#include "ActionRool.h"USING_NS_CC;//构造性方法void Hero::InitHeroSprite(char *hero_name, int m_iLevel){//属性初始化m_HeroSprite = NULL;m_bCanCrazy = false;m_bIsAction = false;m_bIsJumping = false;HeroDirection = false;//向右运动Hero_name = NULL;IsRunning = false;IsAttack = false;IsHurt = false;IsDead = false;m_iCurrentMp = 0.0f;m_iTotleMp = 100.0f;m_iSpeed = 5;Hero_name = hero_name;m_iCurrentHp = m_iTotleHp = 300.0f*m_iLevel;percentage = 100.0f;this->m_HeroSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(hero_name));this->addChild(m_HeroSprite);}Sprite* Hero::GetSprite(){return m_HeroSprite;}//动作方法//设置动作void Hero::SetAnimation(const char *frameName, float delay, bool run_direction){//调整方向if(HeroDirection !=run_direction){HeroDirection = run_direction;m_HeroSprite->setFlippedX(run_direction);}if(IsRunning || IsHurt || IsAttack)return;//创建动画动作Animate* action = ActionTool::animationWithFrameName(frameName,-1,delay);m_HeroSprite->runAction(action);IsRunning = true;}void Hero::StopAnimation(){if(!IsRunning)return;m_HeroSprite->stopAllActions();//当前精灵停止所有动画//恢复精灵原来的初始化贴图this->removeChild(m_HeroSprite,true);//把原来的精灵删除掉this->m_HeroSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Hero_name));m_HeroSprite->setFlippedX(HeroDirection);this->addChild(m_HeroSprite);IsRunning = false;}//跳起void Hero::JumpUpAnimation(const char *name_each, float delay, bool run_direction){//调整方向if(HeroDirection != run_direction){HeroDirection = run_direction;m_HeroSprite->setFlippedX(run_direction);}if(IsHurt || IsAttack || IsDead)return;//创建动画动作Animate* action = ActionTool::animationWithFrameName(name_each,-1,delay);m_HeroSprite->runAction(action);m_bIsJumping = true;}//跳落void Hero::JumpDownAnimation(const char *name_each, float delay, bool run_direction){//调整方向if(HeroDirection != run_direction){HeroDirection = run_direction;m_HeroSprite->setFlippedX(run_direction);}if(IsHurt || IsAttack)return;Animate* action = ActionTool::animationWithFrameName(name_each,-1,delay);m_HeroSprite->runAction(action);m_bIsJumping = true;}//跳完void Hero::JumpEnd(){m_HeroSprite->stopAllActions();//恢复精灵原来的初始化贴图this->removeChild(m_HeroSprite,true);//把原来的精灵删除掉this->m_HeroSprite = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(Hero_name));m_HeroSprite->setFlippedX(HeroDirection);this->addChild(m_HeroSprite);m_bIsJumping = false;}//攻击void Hero::AttackAnimation(const char *name_each, float delay, bool run_direction){//调整方向if(HeroDirection != run_direction){HeroDirection = run_direction;m_HeroSprite->setFlippedX(run_direction);}if(IsAttack || m_bIsJumping)return;//创建动画动作Animate* action = ActionTool::animationWithFrameName(name_each, 1, delay);      //创建回调动作,受伤动画结束调用HurtEnd()  CallFunc* callFunc = CallFunc::create(this, callfunc_selector(Hero::AttackEnd));      //创建连续动作      ActionInterval* attackact = Sequence::create(action, callFunc, NULL);      m_HeroSprite->runAction(attackact);      IsAttack = true;  }void Hero::AttackEnd(){m_HeroSprite->setFlippedX(HeroDirection);IsAttack = false;if(m_bCanCrazy == true){m_bCanCrazy = false;m_iCurrentMp = 0;}}// 受伤  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(HeroDirection);          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, HeroDirection);      }  }    // 死亡  void Hero::DeadAnimation(const char *name_each, float delay, bool run_directon)  {      m_HeroSprite->stopAllActions();      // 调整方向      if (HeroDirection != run_directon)      {          HeroDirection = 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(HeroDirection);      this->addChild(m_HeroSprite);    }    // 判断位置  bool Hero::JudgePosition(Size visibleSize)  {      if (this->getPositionX() > (visibleSize.width / 2.0 + 2.0) || (this->getPositionX() < visibleSize.width / 2.0 - 2.0)) // 精灵到达mid?          return false;      else          return true;//到达中间位置  }  


阅读全文
0 0
原创粉丝点击