功夫小子实践开发-英雄实体类的基本分析和实现
来源:互联网 发布:武汉纵横网络 编辑:程序博客网 时间: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
- 功夫小子实践开发-英雄实体类的基本分析和实现
- 功夫小子实践开发-基本工具类的分析和实现
- 功夫小子实践开发-具有简单AI的怪物类的分析和实现
- 功夫小子实践开发-资源异步加载及过渡场景的分析和实现
- 功夫小子实践开发-菜单场景之游戏秘籍场景的分析和实现
- 功夫小子实践开发-开发环境的基本搭建和配置
- 功夫小子实践开发-游戏设置功能的实现
- 【Cocos游戏实战】功夫小子第一课需求分析和开发环境的基本配置
- 功夫小子实践开发-Menu家族学习及开始菜单场景的实现
- 【Cocos游戏实战】功夫小子第六课之游戏主功能场景的分析和实现
- 【Cocos游戏实战】功夫小子第二课之基础类分析和实现
- cocos2d-x实战项目开发:功夫小子之需求分析和开发准备-课程概要
- 【Cocos游戏实战】功夫小子第三课之过渡场景和开始菜单的实现
- 【Cocos游戏实战】功夫小子第四课之设置功能和图籍场景的实现
- 【Cocos游戏实战】功夫小子第五课之帮助场景和选关功能的实现
- 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现
- 【Cocos游戏实战】功夫小子第八课之游戏打包和相关问题说明
- cocos2dx 3.10 功夫小子学习笔记
- Maven学习记录(1)——Maven项目中导入本地自定义jar包
- csv--->hive
- 动态规划问题
- Java8 HashMap源码分析
- node 控制 树莓派做的天气闹钟
- 功夫小子实践开发-英雄实体类的基本分析和实现
- HDU5880(AC自动机)
- Java 对象集合按指定要求排序
- [SDUT](2107) 图的深度遍历 ---DFS(图)
- 大数据基础概念(1)
- 在树莓派上使用LimeSDR
- 占楼
- 【词汇详解】事务详解
- windows可视化编程(一)