cocos2dx - v2.3.3编辑器骨骼动画
2015-12-11 11:35
399 查看
接上一节内容:cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配
本节主要Cocos骨骼动画的创建及使用
[b]一、新建[/b]
[b] [/b]用Cocos Studio工具新建一个状态栏项目。如下图:
View Code
这样在战斗中,添加了对应的头文件后,我们就可以正常添加使用了。
然后在点击屏幕的事件我们也做下修改。
这样就实现了点击左半屏移动,右半屏实现攻击。效果如下
![](http://images2015.cnblogs.com/blog/311286/201512/311286-20151211113359183-1307500691.png)
本节主要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(); } }
这样就实现了点击左半屏移动,右半屏实现攻击。效果如下
![](http://images2015.cnblogs.com/blog/311286/201512/311286-20151211113359183-1307500691.png)
![](http://images2015.cnblogs.com/blog/311286/201512/311286-20151211113410886-1383077571.png)
相关文章推荐
- cocos2dx3.1.1+cocosstudio+lua问题总结
- Cocos2D-Android-1之源码详解:22.TileMapTest
- 【Cocos2d-x 3.x】 调度器Scheduler类源码分析
- 【cocos2d-x 3D游戏开发】2: 2D基础回顾---理解CCMenu类的实现, 实现点击放大的菜单按钮
- COCOS2D-3.9 ApplicationProtocol 分析
- 关于cocos2dx的背景音乐和音效(3)
- cocos2d-x mruby学习笔记 CCUI库的一个小BUG
- cocos2d js 给sprite增加按钮点击事件
- C#窗体应用程序实现cocos2dx json文件自动生成lua文件
- Cocos学习笔记——Menu
- IOS版Cocos2d-x2.2使用移动广告聚合平台集成插屏广告教程
- cocos2d-x v2 和 v3 对照手册
- AppUtils 常用函数总结(Cocos2d-x 3.9)
- cocos2dx - v2.3.3编辑器简单使用及不同分辨率适配
- Cocos2D-X shader(二) OpenGL渲染管线
- cocos2d-x3.0 相对布局(一)
- COCOS2D-3.9 FileUtils 分析(三) 文件查找深入
- Cocos2D-Android-1之源码详解:7.CocosNodeTest
- COCOS2D-3.9 FileUtils 分析(二) 变量深入
- cocos2dx 消息推送