cocos2dx游戏--欢欢英雄传说--添加动作
添加完人物之后接着给人物添加上动作。
我们为hero添加4个动作:attack(由3张图片构成),walk(由2张图片构成),hit(由1张图片构成),dead(由1张图片构成);同样,为enemy添加4个动作:attack(由3张图片构成),walk(由2张图片构成),hit(由1张图片构成),dead(由1张图片构成)。
取名分别为:hero-attack-0.png,hero-attack-1.png,hero-attack-2.png,hero-walk-0.png,hero-walk-1.png,hero-hit-0.png,hero-dead-0.png,enemy-attack-0.png,enemy-attack-1.png,enemy-attack-2.png,enemy-walk-0.png,enemy-walk-1.png,enemy-hit-0.png,enemy-dead-0.png。
其中,hero开头的表示hero的动作;enemy开头的表示enemy的动作。attack表示攻击时的动作,walk表示走路时的动作,hit表示受伤时的动作,dead表示死亡时的动作。这些图片资源如下:
hero-attack-0.png:
hero-attack-1.png:
hero-attack-2.png:
hero-walk-0.png:
hero-walk-1.png:
hero-hit-0.png:
hero-dead-0.png:
enemy-attack-0.png:
enemy-attack-1.png:
enemy-attack-2.png:
enemy-walk-0.png:
enemy-walk-1.png:
enemy-hit-0.png:
enemy-dead-0.png:
然后这些图片都存放在Resources/image/目录下,我们需要为这些图片组合成一些列的动作。下面的代码演示了如何将这些图片组合成8个animation并存放在AnimationCache中:
HelloWorld::init()部分代码:
// hero-attack
spriteFrame = CCSpriteFrame::create("images/hero-attack-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-attack-0.png");
spriteFrame = CCSpriteFrame::create("images/hero-attack-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-attack-1.png");
spriteFrame = CCSpriteFrame::create("images/hero-attack-2.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-attack-2.png");
// hero-walk
spriteFrame = CCSpriteFrame::create("images/hero-walk-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-walk-0.png");
spriteFrame = CCSpriteFrame::create("images/hero-walk-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-walk-1.png");
// hero-hit
spriteFrame = CCSpriteFrame::create("images/hero-hit-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-hit-0.png");
// hero-dead
spriteFrame = CCSpriteFrame::create("images/hero-dead-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-dead-0.png"); // enemy-attack
spriteFrame = CCSpriteFrame::create("images/enemy-attack-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-attack-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-attack-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-attack-1.png");
spriteFrame = CCSpriteFrame::create("images/enemy-attack-2.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-attack-2.png");
// enemy-walk
spriteFrame = CCSpriteFrame::create("images/enemy-walk-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-walk-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-walk-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-walk-1.png");
// enemy-hit
spriteFrame = CCSpriteFrame::create("images/enemy-hit-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-hit-0.png");
// enemy-dead
spriteFrame = CCSpriteFrame::create("images/enemy-dead-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-dead-0.png"); /** add animation cache **/
// hero-attack
auto animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-attack-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-attack");
// hero-walk
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-walk-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-walk");
// hero-hit
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-hit-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-hit");
// hero-dead
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-dead-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-dead"); // enemy-attack
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-attack-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-attack");
// hero-walk
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-walk-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-walk");
// hero-hit
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-hit-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-hit");
// hero-dead
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-dead-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-dead");
我们在Player中添加一个函数来查看效果:
在Player.h中添加:
void runActionForever(std::string action);
在Player.cpp中添加:
void Player::runActionForever(std::string action)
{
auto animation = AnimationCache::getInstance()->getAnimation(action);
auto animate = Animate::create(animation);
this->runAction(RepeatForever::create(animate));
}
然后在HelloWorld::init()最后添加如下代码查看效果:
player->runActionForever("hero-attack");
enemy->runActionForever("enemy-walk");
效果如下:

#include "HelloWorldScene.h"
#include "SimpleAudioEngine.h"
#include "Player.h" USING_NS_CC; Scene* HelloWorld::createScene()
{
// 'scene' is an autorelease object
auto scene = Scene::create(); // 'layer' is an autorelease object
auto layer = HelloWorld::create(); // add layer as a child to scene
scene->addChild(layer); // return the scene
return scene;
} // on "init" you need to initialize your instance
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
} auto visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin(); Sprite* background = Sprite::create("images/background.png");
background->setPosition(origin + visibleSize/);
this->addChild(background); SpriteFrame *spriteFrame = CCSpriteFrame::create("images/hero-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-0.png");
// hero-attack
spriteFrame = CCSpriteFrame::create("images/hero-attack-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-attack-0.png");
spriteFrame = CCSpriteFrame::create("images/hero-attack-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-attack-1.png");
spriteFrame = CCSpriteFrame::create("images/hero-attack-2.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-attack-2.png");
// hero-walk
spriteFrame = CCSpriteFrame::create("images/hero-walk-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-walk-0.png");
spriteFrame = CCSpriteFrame::create("images/hero-walk-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-walk-1.png");
// hero-hit
spriteFrame = CCSpriteFrame::create("images/hero-hit-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-hit-0.png");
// hero-dead
spriteFrame = CCSpriteFrame::create("images/hero-dead-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "hero-dead-0.png"); // enemy-attack
spriteFrame = CCSpriteFrame::create("images/enemy-attack-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-attack-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-attack-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-attack-1.png");
spriteFrame = CCSpriteFrame::create("images/enemy-attack-2.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-attack-2.png");
// enemy-walk
spriteFrame = CCSpriteFrame::create("images/enemy-walk-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-walk-0.png");
spriteFrame = CCSpriteFrame::create("images/enemy-walk-1.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-walk-1.png");
// enemy-hit
spriteFrame = CCSpriteFrame::create("images/enemy-hit-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-hit-0.png");
// enemy-dead
spriteFrame = CCSpriteFrame::create("images/enemy-dead-0.png", CCRectMake(, , , ));
SpriteFrameCache::getInstance()->addSpriteFrame(spriteFrame, "enemy-dead-0.png"); /** add animation cache **/
// hero-attack
auto animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-attack-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-attack");
// hero-walk
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-walk-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-walk");
// hero-hit
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-hit-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-hit");
// hero-dead
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("hero-dead-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "hero-dead"); // enemy-attack
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-attack-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-attack");
// hero-walk
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-walk-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-walk");
// hero-hit
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-hit-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-hit");
// hero-dead
animation = Animation::create();
animation->setDelayPerUnit(0.2f);
for (int i = ; i < ; i ++)
{
auto sfName =String::createWithFormat("enemy-dead-%d.png", i)->getCString();
animation->addSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName(sfName));
}
AnimationCache::getInstance()->addAnimation(animation, "enemy-dead"); Player* player = Player::create(Player::PlayerType::HERO);
player->setPosition(origin.x + player->getContentSize().width/, origin.y + visibleSize.height/);
this->addChild(player);
Player* enemy = Player::create(Player::PlayerType::ENEMY);
enemy->setPosition(origin.x + visibleSize.width - player->getContentSize().width/, origin.y + visibleSize.height/);
this->addChild(enemy); player->runActionForever("hero-attack");
enemy->runActionForever("enemy-walk"); return true;
} void HelloWorld::menuCloseCallback(Ref* pSender)
{
Director::getInstance()->end(); #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit();
#endif
}
HellWorldScene.cpp
#ifndef __Palyer__
#define __Player__
#include "cocos2d.h"
USING_NS_CC; class Player : public Sprite
{
public:
enum PlayerType
{
HERO,
ENEMY
};
bool initWithPlayerType(PlayerType type);
static Player* create(PlayerType type);
void runActionForever(std::string action);
}; #endif
Player.h
#include "Player.h"
bool Player::initWithPlayerType(PlayerType type)
{
std::string spName = "";
switch (type)
{
case PlayerType::HERO:
spName = "hero-0.png";
break;
case PlayerType::ENEMY:
spName = "enemy-0.png";
break;
}
this->initWithSpriteFrameName(spName);
return true;
}
Player* Player::create(PlayerType type)
{
Player* player = new Player();
if (player && player->initWithPlayerType(type))
{
player->autorelease();
return player;
}
else
{
delete player;
player = NULL;
return NULL;
}
}
void Player::runActionForever(std::string action)
{
auto animation = AnimationCache::getInstance()->getAnimation(action);
auto animate = Animate::create(animation);
this->runAction(RepeatForever::create(animate));
}
Player.cpp
cocos2dx游戏--欢欢英雄传说--添加动作的更多相关文章
- cocos2dx游戏--欢欢英雄传说--添加游戏背景
经过一段时间的学习cocos2dx,接下来我想要实践开发一个小游戏,我把它命名为“欢欢英雄传说”,项目名将取为HuanHero.环境:cocos2dx环境:cocos2d-x 3.11.1IDE:Co ...
- cocos2dx游戏--欢欢英雄传说--添加攻击按钮
接下来添加攻击按钮用于执行攻击动作.同时修复了上一版移动时的bug.修复后的Player::walkTo()函数: void Player::walkTo(Vec2 dest) { if (_seq) ...
- cocos2dx游戏--欢欢英雄传说--添加人物
接下来需要导入精灵帧资源,因为之前下载了TexturePacker,然后通过TexturePacker的"Publish sprite sheet"方法可以生成一个.pvr.ccz ...
- cocos2dx游戏--欢欢英雄传说--添加触摸响应
主要的调整就是将HelloWorldScene改成了MainSecne,然后将Player作为了MainScene的私有成员变量来处理.修改了人物图片,使用了网上找到的三国战纪的人物素材代替我之前画的 ...
- cocos2dx游戏--欢欢英雄传说--为敌人添加移动和攻击动作
这里主要为敌人添加了一个移动动作和攻击动作.移动动作是很简略的我动他也动的方式.攻击动作是很简单的我打他也打的方式.效果:代码: #ifndef __Progress__ #define __Prog ...
- cocos2dx游戏--欢欢英雄传说--添加血条
用一个空血槽图片的Sprite做背景,上面放一个ProgressTimer, 通过设置ProgressTimer的进度来控制血条的长短.建立一个Progress类来实现.Progress.h: #if ...
- Learning Cocos2d-x for WP8(8)——动作Action
原文:Learning Cocos2d-x for WP8(8)--动作Action 游戏很大程度上是由动作画面支撑起来的. 动作分为两大类:瞬间动作和延时动作. 瞬间动作基本等同于设置节点的属性,延 ...
- cocos2d-x游戏引擎核心之九——跨平台
一.cocos2d-x跨平台 cocos2d-x到底是怎样实现跨平台的呢?这里以Win32和Android为例. 1. 跨平台项目目录结构 先看一下一个项目创建后的目录结构吧!这还是以HelloCpp ...
- cocos2d-x游戏引擎核心之三——主循环和定时器
一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...
随机推荐
- 修改主机名hostname
关于修改linux hostname的问题,尤其是redhat 7修改hostname的方式 2017年03月29日 13:56:45 阅读数:4989 首先强调一点,不同的系统,或者同一个系统的不同 ...
- BM和KMP字符串匹配算法学习
BM和KMP字符串匹配算法学习 分类: 研究与学习 字符串匹配BM(Boyer-Moore)算法学习心得 http://www.cnblogs.com/a180285/archive/2011/12/ ...
- 如何打一手好Log
如果项目上过线的话,那你一定知道Log是多么重要. 为什么说Log重要呢?因为上线项目不允许你调试,你只能通过Log来分析问题.这时打一手好Log的重要性绝不亚于写一手好代码.项目出问题时,你要能拿出 ...
- firewalled centos7
zone绑定网卡 firewall-cmd --zone=internal --add-interface=ens192 --permanent firewall-cmd --permanent -- ...
- scp基本使用方法
scp基本使用方法: scp用于在两台电脑之间进行数据的copy,形式如下: 第一种, scp [-r] 文件/文件夹 user@host:dir ,需要输入密码. 第二种, scp [-r] ...
- 有趣的 Mysql 存储引擎
Mysql 提供了一套统一的应用开发模型和核心 API,因此,尽管不同的存储引擎拥有不同的特性,不过对于开发人员,应用操作都是完全透明的.应用层的连接并不直接访问存储引擎层,而是访问 Mysql 提供 ...
- Hadoop2的Yarn和MapReduce2相关
转自: http://www.aboutyun.com/thread-7678-1-1.html.. 问题导读: 1.什么是yarn? 2.Yarn 和MapReduce相比,它有什么特殊作用 ? ...
- DirectoryEntry 账户启动与停用 以及创建账户等
启动账户: DirectoryEntry usr = new DirectoryEntry("LDAP://CN=New User,CN=users,DC=fabrikam,DC=com&q ...
- vector push_back报错
场景:定义了一个结构体,包含一个vector的成员变量,在给这个vTQ push_back数据的时候报错. typedef struct tag_TQInfo { int iTime; int iMa ...
- udp编程中,一次能发送多少个bytes为好?
在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好? 当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对 像ICQ一类的发送聊天消息 ...