接上一节内容:cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配

本节主要Cocos骨骼动画的创建及使用

一、新建

  用Cocos Studio工具新建一个状态栏项目。如下图:

    

  当然也可以新建一个空的Cocos项目,然后在 文件->新建文件 中选择骨骼动画来创建新的骨骼动画,如下图

    

  因为这里只讲简单用法,着重使用,所有直接创建英雄示例动画。

二、添加动画

  选择动画模式,并点击如下播放按钮,可以看到现在默认的动画。

    

  示例中只有ALL动画,我们需要将每个动画按起始结束帧率分开,添加如下动画:

    

  这样就有了休闲动画(default),跑步动画(run),攻击动画(attack),受伤动画(injure),死亡动画(death)。

这里还是额外在讲下骨骼动画记录的使用。

  1、首先如下在右边的帧查看中 添加起始帧

    

  2、直接改变预览显示中的骨骼对应的位置或者,旋转等,这时编辑器就会自动记录当前帧的各自状态。

  3、在间隔一定的帧率再添加对应的结束帧,然后设置坐标等。这样在起始结束帧就可以对应的播放动画了。

注意事项:

  默认情况下,新添加的帧只会记录以下左图几个数据,如果我们需要记录类似显示隐藏,透明度等数据,需要在调整数据前将右图的开始记录动画选项勾上。

            

  这样就会对修改的其他数据进行记录了,如下图

    

三、导出到项目

  同样的,在编辑好动画之后,我们需要跟上一节一样导出到游戏项目的Resource目录下

为了方便管理,我们这里也把玩家单独提出一个类来。

#ifndef __CPlayer_H__
#define __CPlayer_H__ #include "cocos2d.h"
#include "cocostudio/CocoStudio.h"
USING_NS_CC;
using namespace cocostudio::timeline; enum enAction
{
ACT_NONE, // 无
ACT_DEFAULT, // 待机
ACT_RUN, // 跑步
ACT_ATTACK, // 攻击
ACT_INJURE, // 受伤
ACT_DEATH, // 死亡
}; class CPlayer : public Node
{
public:
// implement the "static create()" method manually
CREATE_FUNC(CPlayer); virtual bool init(); void Move(float deltaX); void Reset(); void Attack(); private:
void PlayAction(enAction nAction); CPlayer();
~CPlayer(); Node* m_pNode;
enAction m_nActType;
ActionTimeline* m_pAction;
}; #endif __CPlayer_H__
#include "Player.h" CPlayer::CPlayer() :m_pNode(NULL), m_pAction(NULL), m_nActType(ACT_NONE)
{
} CPlayer::~CPlayer()
{
m_pNode = NULL;
if (m_pAction)
{
m_pAction->release();
m_pAction = NULL;
}
} bool CPlayer::init()
{
std::string filePath = "Hero.csb";
m_pNode = CSLoader::createNode(filePath);
if (m_pNode)
{
m_pAction = CSLoader::createTimeline(filePath);
if (m_pAction)
{
m_pAction->retain();
m_pNode->runAction(m_pAction); PlayAction(enAction::ACT_DEFAULT);
}
this->addChild(m_pNode);
return true;
}
return false;
} void CPlayer::Move(float deltaX)
{
if (m_nActType != ACT_DEFAULT && m_nActType != ACT_RUN)
{
return;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
#define isFloatZero(a) ((a) > -0.000001f && (a) < 0.0000001f)
if (!isFloatZero(deltaX))
{
float delta = deltaX< ? - : ;
// 计算移动后的位置
float desX = this->getPositionX() + delta;
if (desX<origin.x)
{
desX = origin.x;
}
if (desX>origin.x + visibleSize.width)
{
desX = origin.x + visibleSize.width;
}
this->setScaleX(deltaX< ? - : );
this->setPositionX(desX);
}
PlayAction(ACT_RUN);
} void CPlayer::Attack()
{
PlayAction(ACT_ATTACK);
}
void CPlayer::Reset()
{
PlayAction(enAction::ACT_DEFAULT);
} void CPlayer::PlayAction(enAction nAction)
{
if (m_pAction)
{
if (m_nActType == nAction || m_nActType == ACT_ATTACK)
{
return;
}
m_nActType = nAction;
switch (nAction)
{
case ACT_DEFAULT:
m_pAction->play("default",true);
break;
case ACT_RUN:
m_pAction->play("run", true);
break;
case ACT_ATTACK:
{
m_pAction->play("attack", false);
std::function<void()> func = [this](){
m_pAction->play("default", true);
m_nActType = ACT_DEFAULT;
};
m_pAction->setLastFrameCallFunc(func);
}
break;
case ACT_INJURE:
m_pAction->play("injure", false);
break;
case ACT_DEATH:
m_pAction->play("death", false);
break;
default:
break;
}
}
}

这样在战斗中,添加了对应的头文件后,我们就可以正常添加使用了。

    // 加载玩家实体
m_pPlayer = CPlayer::create();
// 设置位置
m_pPlayer->setPosition(Vec2(visibleSize.width / + origin.x, + origin.y));
// 添加到节点上
this->addChild(m_pPlayer, );

然后在点击屏幕的事件我们也做下修改。

bool HelloWorld::onTouchBegan(Touch *pTouch, Event *unused_event)
{
if (m_pPlayer)
{
// 防止超出屏幕
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
if (pTouch->getLocation().x>visibleSize.width*0.5 + origin.x)
{
m_pPlayer->Attack();
}
else
{
m_pPlayer->Move(pTouch->getDelta().x);
}
}
return true;
} void HelloWorld::onTouchMoved(Touch *pTouch, Event *pEvent)
{
if (m_pPlayer)
{
// 点击左半屏幕
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
if (pTouch->getLocation().x < visibleSize.width*0.5 + origin.x)
{
m_pPlayer->Move(pTouch->getDelta().x);
}
}
} void HelloWorld::onTouchEnded(Touch *pTouch, Event *pEvent)
{
if (m_pPlayer)
{
m_pPlayer->Reset();
}
}

这样就实现了点击左半屏移动,右半屏实现攻击。效果如下

cocos2dx - v2.3.3编辑器骨骼动画的更多相关文章

  1. cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配

    准备工具 Cocos 引擎当前最新版本:v2.3.3       官网下载地址: http://www.cocos.com/download/ 前述:cocos自带UI编辑器在最新的版本有了很大的改动 ...

  2. cocos2dx骨骼动画Armature源码分析(一)

    源码分析一body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-to ...

  3. cocos2d-x开发记录:二,基本概念(骨骼动画)

    九,骨骼动画 1.骨骼动画vs Sprite sheets 你能使用sprite sheets 创建动画,它很快又容易.直到你意识到你的游戏需要大量的动画并且内存消耗越来越高,并且需要时间载入全部数据 ...

  4. cocos2dx骨骼动画Armature源码分析(三)

    代码目录结构 cocos2dx里骨骼动画代码在cocos -> editor-support -> cocostudio文件夹中,win下通过筛选器,文件结构如下.(mac下没有分,是整个 ...

  5. cocos2dx骨骼动画Armature源码分析(二)

    flash中数据与xml中数据关系 上篇博文从总体上介绍了cocos2dx自带的骨骼动画,这篇介绍一下导出的配置数据各个字段的含义(也解释了DragonBone导出的xml数据每个字段的含义). sk ...

  6. cocos2d-x 3.0 版本 骨骼动画设置shader

    因为骨骼动画是由多个sprite组成, 所以需要遍历每个sprite 才能修改整体, 开头这样设置,在游戏中发现走路状态没问题,攻击状态就有部分sprite没效果 for (auto & ob ...

  7. cocos2dx 2.x 骨骼动画优化

    本文原链接:http://www.cnblogs.com/zouzf/p/4450861.html 公司用的骨骼动画的版本貌似还停留在2.1之前的年代而已没有更新,该因各种历史原因吧,而有个大项目“一 ...

  8. Android设备 cocos2dx 骨骼动画注册事件播放音效,退到后台再返回黑屏问题

    最近遇到一个cocos2dx 骨骼动画注册事件播放音效,在骨骼动画播放的时候,按HOME键退到桌面,再次打开游戏的时候,会黑屏. 解决办法如下,可能不是太完美,至少解决了大部分问题. 1.在org.c ...

  9. cocos creator 动画编辑器以及骨骼动画的使用

    一.普通动画的设置 1.添加动画组件 a.添加空节点=>添加动画组件 b.新建Clip文件=>打开编辑模式添加动画编辑(并且把添加的clip文件拖动到右边面板的Default Clip 与 ...

随机推荐

  1. 个人附加作业XD --这门课终于结束了~~

    你认为每次项目的评分标准存在哪些问题,你认为的合理评分准则是怎样的(个人/结对/团队算三个) 评分的话我个人觉得是存在一些问题的. 第一,分数差异 问题:一个就是各班的成绩评分有高有低,有的班整体分数 ...

  2. 学号:201521123116 《java程序设计》第一周学习总结

    #1. 本章学习总结了解了班级的纪律和期末成绩组成.本周重点学习了java语言的特点具有简单性和结构中立.明白了jdk是java开发人员使用的一种工具,以及编写一个java程序的所需步骤,懂得了jdk ...

  3. How To:禁用ubuntu全局菜单(global menu)的方法

    刚从windows转过来的新手可用会觉得ubuntu unity下的全局菜单(global menu)用起来很不方便.下边是介绍去除全局菜单的方法 1.打开终端(可以去dash主页里面搜,也可以直接按 ...

  4. 201521123034《Java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  5. eclipse版本选择

    Eclipse最初是由IBM公司开发的替代商业软件Visual Age for Java的下一代IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会. Ec ...

  6. 数据结构与算法->树->2-3-4树的查找,添加,删除(Java)

    代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 目录 一. 2-3-4树的定义 二. 2-3-4树数据结构定义 三. 2-3-4树的可以得到 ...

  7. Oracle总结第三篇【PLSQL】

    PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL- SQL99是什么 (1)是操作所有关系型数据库的规则 ...

  8. temp-重庆农商行二次出差

    1, 住宿(远舰商务酒店) 与胡仕川一起住   1722房间,  178-27=151(返现后). 7月30日   7月31日  8月1日 8月2日 8月3日 2, 住宿(郎菲酒店)一个人住, 158 ...

  9. JavaScript基础回顾

    1, NaN 不是数字  Infinity 无穷大 alert(parseInt("dd")); //NaN alert(1/0); //Infinity 2, 逻辑或 || ,返 ...

  10. .NET Core 使用RabbitMQ

    RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...