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 已经为我们隐藏了游戏主循环的实现.读 ...
随机推荐
- Linux 下 ps 命令
简述 Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,动态的显示进程信息 ...
- kubernetes 数据持久化
pod本身是无状态,所以很多有状态的应用,就需要将数据进行持久化. 1:将数据挂在到宿主机.但是pod重启之后有可能到另外一个节点,这样数据虽然不会丢但是还是有可能会找不到 apiVersion: v ...
- SpringBoot配置成Liunx服务
spring boot 可以打包成可执行的脚本来启动,其原理是在打成包时,将shell脚本注入到jar包中 #参考:https://docs.spring.io/spring-boot/docs/1. ...
- java资料——线性表(转)
线性表 线性表(亦作顺序表)是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单, ...
- 文件服务器和web应用分离的思路(转)
目前在做一个应用,有不同的客户端,包括web应用的客户端,其他的客户端,都要访问我的文件服务器,通过文件服务程序提供的服务来访问文件,但是对文件管理服务器这个应用,没有什么思路,请大家给点思路,谢谢: ...
- AI,DM,ML,PR的区别与联系
数据挖掘和机器学习的区别和联系,周志华有一篇很好的论述<机器学习与数据挖掘>可以帮助大家理解.数据挖掘受到很多学科领域的影响,其中数据库.机器学习.统计学无疑影响最大.简言之,对数据挖掘而 ...
- centos 部署 SparkR
---恢复内容开始--- 环境配置—— 操作系统:CentOS 6.5 JDK版本:1.7.0_67 Hadoop集群版本:CDH 5.3.0 安装过程—— 1.(1)安装R yum install ...
- Python 出现错误 SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform.
报出SNIMissingWarning和InsecurePlatformWarning警告. 解决方法: 在cmd中输入: pip install pyopenssl ndg-httpsclient ...
- Windows App开发之集成设置、帮助、搜索和共享
应用设置和应用帮助 "设置"合约 上一节中我们学习了怎样将应用设置保存到本地.这样的方式是通过在App内加入设置选项,这里另一种方式. 微软将其称为"设置"合约 ...
- TinyOS节点间通信相关接口和组件介绍
一.基本通信接口: Packet:提供了对message_t抽象数据类型的基本访问.这个接口的命令有:清空消息内容,获得消息的有效载荷区长度,获得消息有效载荷区的指针. //tos/interfa ...