您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx - v2.3.3编辑器骨骼动画

2015-12-11 11:35 399 查看
接上一节内容:cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配

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

[b]一、新建[/b]

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

    

#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<0 ? -2 : 2;
// 计算移动后的位置
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<0 ? -1 : 1);
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;
}
}
}


View Code

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

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


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

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();
}
}


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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: