您的位置:首页 > 移动开发 > Cocos引擎

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

2017-08-07 20:13 429 查看
*图片来源见水印

进行的基本步骤是:

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



而具有的方法则分为:



代码如下:

.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;

}

/
4000
/ 受伤结束
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;//到达中间位置
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x 游戏实践 C++
相关文章推荐