cocos2dx中的动画以及TexturePacker使用



之前向Andreas Loew申请了一枚TexturePacker注册码,很快都下来了,作为回报我打算还是写一篇关于TexturePacker的使用博客吧,有兴趣的可以在这里申请密钥,http://www.codeandweb.com,前不久他也来信回访过问我使用感觉怎样,因为工作的原因,太忙了,这里我主要介绍下cocos2dx中的动画以及TexturePacker使用。

做动画之前,要准备素材,在demo中的你可以下载:http://pan.baidu.com/share/link?shareid=1419818902&uk=3088193979

打开TexturePacker,

这个相信大家都看得懂,这里选择cocos2d,然后添加文件夹,该工具会自动加载纹理图片,选择打包的纹理图片以及plist输出路径:


各项参数设定完毕,发布,你会在设置的输出路径得到打包好的图片以及一个plist文件;

接下来,介绍下动画的创作:

动画创作有很多中方式,这里我就采用plist方式来创建动画;注意几点 1.精灵帧缓冲;2.精灵帧;3.动画序列容器;ps:再次建议学2dx的话,有精力, 把源码翻来看看,因为我们很多是记不住的 但是原理一定要明白。

这里直接上创建动画步骤,demo代码片段:

1、加载plist到缓冲帧里面,这里通过数组来创建动画帧序列;

2.将精灵帧添加到数组中;

3.创建精灵;

4.创建动画序列帧(注意动画序列容易这里CCSequence用类型),最后回调runAction(CCAction *action);


01#ifndef __ROLE__HH__
02#define   __ROLE__HH__
03#include "cocos2d.h"
04USING_NS_CC;
05class role:public CCLayer
06{
07public:
08    role(void);
09    ~role(void);
10    virtual bool init(); 
11    static cocos2d::CCScene* scene();
12    CREATE_FUNC(role);
13};
14#endif




001#include "role.h"
002 
003 
004role::role(void)
005{
006}
007 
008 
009role::~role(void)
010{
011}
012 
013bool role::init()
014{
015      bool bRet = false;
016    do
017    {
018        //-new-//
019        CCSize mysize=CCDirector::sharedDirector()->getWinSize();
020        //把role.plist加入缓存帧
021        CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("role/role.plist");
022     
023 
024        //创建帧数组--数组来保存帧动画
025        CCArray * attackArray=CCArray::create();
026        //attackArray->retain();
027 
028        CCArray * attackArray2=CCArray::create();
029        //attackArray2->retain();
030 
031 
032        CCArray * runArray=CCArray::create();
033        //runArray->retain();
034 
035        CCArray * walkArray=CCArray::create();
036 
037 
038        for (int index=1;index!=9;++index)
039        {
040            //从缓存中获取精灵帧添加到数组中
041            CCLOG(CCString::createWithFormat("%s%d.png","Img_Zhici",index)->getCString());
042            attackArray->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->
043                spriteFrameByName(CCString::createWithFormat("%s%d.png","Img_Zhici",index)->getCString()));
044        }
045        //Img_Zhn1.png
046        for (int i=1;i!=17;++i)
047        {
048            //从缓存中获取精灵帧添加到数组中
049            CCLOG(CCString::createWithFormat("%s%d.png","Img_Zhn",i)->getCString());
050            attackArray2->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->
051                spriteFrameByName(CCString::createWithFormat("%s%d.png","Img_Zhn",i)->getCString()));
052        }
053        //run
054        for (int i=1;i!=7;++i)
055        {
056            CCLOG(CCString::createWithFormat("%s%d.png","Img_ZRun",i)->getCString());
057            runArray->addObject(CCSpriteFrameCache::sharedSpriteFrameCache()->
058                spriteFrameByName(CCString::createWithFormat("%s%d.png","Img_ZRun",i)->getCString()));
059        }
060 
061         //walk
062           for (int i=1;i!=7;++i){
063               CCString::createWithFormat("%s%d.png","Img_Zwlak",i)->getCString();
064               walkArray->addObject(
065                   CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(
066                   CCString::createWithFormat("%s%d.png","Img_Zwlak",i)->getCString()));
067           }
068 
069 
070        //创建攻击类型1 精灵
071        CCSprite * sp=CCSprite::createWithSpriteFrame((CCSpriteFrame*)attackArray->objectAtIndex(0));
072        sp->setPosition(ccp(mysize.width/4,mysize.height/3));
073        this->addChild(sp);
074 
075 
076        //创建攻击类型2精灵
077        CCSprite * standAttack=CCSprite::createWithSpriteFrame((CCSpriteFrame*)attackArray2->objectAtIndex(0)); 
078        CCSize visibleSize= CCDirector::sharedDirector()->getVisibleSize();
079        standAttack->setPosition(ccp(visibleSize.width/3,visibleSize.height/3));
080        this->addChild(standAttack);
081 
082        //通过数组中的第一个精灵帧 创建奔跑精灵 
083        CCSprite *runsprite=CCSprite::createWithSpriteFrame((CCSpriteFrame*)runArray->objectAtIndex(0));
084        runsprite->setPosition(ccp(visibleSize.width/2,visibleSize.height/3));
085        this->addChild(runsprite);
086 
087 
088        CCSprite *walkSprite=CCSprite::createWithSpriteFrame((CCSpriteFrame*)walkArray->objectAtIndex(0));
089        walkSprite->setPosition(ccp(visibleSize.width/1.5,visibleSize.height/3));
090        this->addChild(walkSprite);
091 
092        //创建动画
093        CCAnimation *animation1=CCAnimation::createWithSpriteFrames(attackArray,0.1f);
094        CCAnimate *attack1=CCAnimate::create(animation1);
095 
096 
097        CCAnimation * standAnimation=CCAnimation::createWithSpriteFrames(attackArray2,0.1f);
098        CCAnimate *standAnimate=CCAnimate::create(standAnimation);
099 
100        CCAnimation * runAnimation=CCAnimation::createWithSpriteFrames(runArray,0.1f);
101        CCAnimate *runAnimate=CCAnimate::create(runAnimation);
102 
103        CCAnimation * walkAnimation=CCAnimation::createWithSpriteFrames(walkArray,0.15f);
104        CCAnimate *walkAnimate=CCAnimate::create(walkAnimation);
105 
106 
107 
108 
109        //CCSequence动作序列容器 CCSpawn
110        CCSequence* pse1=CCSequence::create(attack1,NULL);
111        CCSequence* pse2=CCSequence::create(standAnimate,NULL);
112        CCSequence* pse3=CCSequence::create(runAnimate,NULL);
113        CCSequence* pse4=CCSequence::create(walkAnimate,NULL);
114     
115        //执行动作 forerver
116        sp->runAction(CCRepeatForever::create(pse1));
117        standAttack->runAction(CCRepeatForever::create(pse2));
118        runsprite->runAction(CCRepeatForever::create(pse3));
119        walkSprite->runAction(CCRepeatForever::create(pse4));
120 
121        CCSpriteFrameCache::sharedSpriteFrameCache()->removeSpriteFramesFromFile("role/role.plist");
122        bRet=true;
123    } while (0);
124 
125    return bRet;
126}
127 
128cocos2d::CCScene* role::scene()
129{
130    CCScene * scene = NULL;
131    do
132    {
133        scene = CCScene::create();
134        CC_BREAK_IF(! scene);
135        role *layer = role::create();
136        CC_BREAK_IF(! layer);
137        scene->addChild(layer);
138    } while (0);
139    return scene;
140}



运行效果如下:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值