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 已经为我们隐藏了游戏主循环的实现.读 ...
随机推荐
- 一款基于jquery和css3的响应式二级导航菜单
今天给大家分享一款基于jquery和css3的响应式二级导航菜单,这款导航是传统的基于顶部,鼠标经过的时候显示二级导航,还采用了当前流行的响应式设计.效果图如下: 在线预览 源码下载 实现的代码. ...
- draw sin
draw sin Steps 导入包 生成X轴,Y轴的数据点 设置输出图大小,像素,前景色 指定线宽,线型,绘制曲线 设置坐标轴范围 显示图形. Code #!/usr/bin/env python ...
- mysql合并查询结果及为表和字段取别名
利用union关键字,可以给出多条select语句,并将它们的结果组合成单个的结果. 合并是,两个表对应的列数和数据类型必须相同. 各个select语句之间使用union或union all关键字分隔 ...
- Linux服务器同步时间
进行Linux服务器的时间同步是一件需要注意的事情,不然,集群中的服务器时间不同将导致许多奇怪问题发生, 如果没有安装crontab,那么,使用yum install crontabs进行安装和启动, ...
- CentOS ext4 磁盘分区 格式化 挂载
[root@appserver ~]# df -h /*查看现有分区情况*/文件系统 容量 已用 可用 已用%% 挂载点/dev/vda1 9.9G 8.2G 1.2G 88% /tmpfs 3.9G ...
- javascript 商务通
/*下面的才是新的商务通*/ var swt_autoDisplay_times=15;/*商务通自动弹出时间,秒为单位*/ var float_left_ad_display_Init=0;/*在允 ...
- Ubuntu-Python2.7安装 scipy,numpy,matplotlib 和pip
一. scipy,numpy,matplotlib sudo apt-get install python-scipy sudo apt-get install python-numpy sudo a ...
- [mysql] MySQL Order By Rand()效率【转载】
最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RA ...
- JDK中的序列化和反序列化
题外话:诸事缠身,不知不觉距离上一篇就将近一个月了,读书不易,学习不易,唯有坚持. 写来写去始终不满意,索性贴一个比较好的文章吧! 参考: [Java基础]序列化与反序列化深入分析
- Checked Exception & Unchecked Exception
查Spring事务管理时看到一句话: Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback:如果发生的异常是chec ...