添加完人物之后接着给人物添加上动作。
我们为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游戏--欢欢英雄传说--添加动作的更多相关文章

  1. cocos2dx游戏--欢欢英雄传说--添加游戏背景

    经过一段时间的学习cocos2dx,接下来我想要实践开发一个小游戏,我把它命名为“欢欢英雄传说”,项目名将取为HuanHero.环境:cocos2dx环境:cocos2d-x 3.11.1IDE:Co ...

  2. cocos2dx游戏--欢欢英雄传说--添加攻击按钮

    接下来添加攻击按钮用于执行攻击动作.同时修复了上一版移动时的bug.修复后的Player::walkTo()函数: void Player::walkTo(Vec2 dest) { if (_seq) ...

  3. cocos2dx游戏--欢欢英雄传说--添加人物

    接下来需要导入精灵帧资源,因为之前下载了TexturePacker,然后通过TexturePacker的"Publish sprite sheet"方法可以生成一个.pvr.ccz ...

  4. cocos2dx游戏--欢欢英雄传说--添加触摸响应

    主要的调整就是将HelloWorldScene改成了MainSecne,然后将Player作为了MainScene的私有成员变量来处理.修改了人物图片,使用了网上找到的三国战纪的人物素材代替我之前画的 ...

  5. cocos2dx游戏--欢欢英雄传说--为敌人添加移动和攻击动作

    这里主要为敌人添加了一个移动动作和攻击动作.移动动作是很简略的我动他也动的方式.攻击动作是很简单的我打他也打的方式.效果:代码: #ifndef __Progress__ #define __Prog ...

  6. cocos2dx游戏--欢欢英雄传说--添加血条

    用一个空血槽图片的Sprite做背景,上面放一个ProgressTimer, 通过设置ProgressTimer的进度来控制血条的长短.建立一个Progress类来实现.Progress.h: #if ...

  7. Learning Cocos2d-x for WP8(8)——动作Action

    原文:Learning Cocos2d-x for WP8(8)--动作Action 游戏很大程度上是由动作画面支撑起来的. 动作分为两大类:瞬间动作和延时动作. 瞬间动作基本等同于设置节点的属性,延 ...

  8. cocos2d-x游戏引擎核心之九——跨平台

    一.cocos2d-x跨平台 cocos2d-x到底是怎样实现跨平台的呢?这里以Win32和Android为例. 1. 跨平台项目目录结构 先看一下一个项目创建后的目录结构吧!这还是以HelloCpp ...

  9. cocos2d-x游戏引擎核心之三——主循环和定时器

    一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...

随机推荐

  1. iOSCocoaPods的安装使用和常见问题

    一.什么是CocoaPods CocoaPods是iOS项目的依赖管理工具,该项目源码在Github上管理.开发iOS项目不可避免地要使用第三方开源库,CocoaPods的出现使得我们可以节省设置和第 ...

  2. 利用IT++搭建通信仿真平台

    IT++ is a C++ library of mathematical, signal processing and communication classes and functions.也就是 ...

  3. 从钉钉微应用定制化导航栏看如何实现Hybrid App开发框架

    钉钉是阿里的一款企业应用APP,里面提供了混合微应用的SDK,这其实最好的一种APP架构模式.微信公众号浏览器JSSDK也提供了类似功能特性,在在交互性上没有钉钉深入. http://ddtalk.g ...

  4. OpenWRT中的按键和灯的GPIO控制实现

    基于BarrierBreaker版本,基于AR9331 AP121 Demo单板 来进行描述 1.灯 A.在mach-ap121.c中,定义了灯所对应的GPIO定义: #define AP121_GP ...

  5. win10设置删除文件提示框

    显示桌面,找到回收站   点击鼠标右键,点击“属性菜单”   勾选“显示删除对话框”   点击“应用”,点击“确定”.   测试一下吧,从电脑删除del删除一个文件.如下图所示,弹出了提示框.

  6. C++实现顺序计算输入表达式的值

    #include <iostream> #include <cstring> #include <cctype>//判断字符类型需要的头文件 using names ...

  7. SecureCRT 用ssh key登录配置方法

    服务器端配置 OS: Debian-6.0.5 复制代码 代码如下: #apt-get install ssh 安装ssh服务 编辑/etc/ssh/sshd_config配置文件 复制代码 代码如下 ...

  8. 利用JavaScript计算引擎进行字符串公式运算

    1.通过js计算引擎计算(java自带) 2.计算公式除了支持基本的方法之外还支持简单js脚本分支计算 3.通过设定map传入参数 4.默认返回最后一个计算结果,如果需返回特定值,将变量补写在公式最后 ...

  9. javascript 商务通

    /*下面的才是新的商务通*/ var swt_autoDisplay_times=15;/*商务通自动弹出时间,秒为单位*/ var float_left_ad_display_Init=0;/*在允 ...

  10. KBEngine.executeRawDatabaseCommand使用

    先贴一段官方的API介绍: def executeRawDatabaseCommand( command, callback, threadID, dbInterfaceName ): 功能说明: 这 ...