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

Cocos2d-X使用CCAnimation创建动画

2015-05-10 00:01 411 查看
http://blog.csdn.net/u010105970/article/details/40593059

动画在游戏中是非常常见的

程序1:创建一个简单的动画

首先需要在工程目录下的Resource文件夹中放一张有各种不同动作的图片



在程序中添加下面的代码

[cpp] view
plaincopy





#include "Animation.h"

CCScene* Animation::scene()

{

CCScene* s = CCScene::create();

Animation* layer = Animation::create();

s->addChild(layer);

return s;

}

bool Animation::init()

{

CCLayer::init();

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

//创建精灵

CCSprite* sp = CCSprite::create();

sp->setPosition(ccp(winSize.width / 2, winSize.height / 2));

addChild(sp);

//精灵放大4倍

sp->setScale(4);

//创建纹理

CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage("walkLeft.png");

//创建一个数组

CCArray* arr = CCArray::create();

//从纹理中扣了10帧frame,组成数组

for(int i = 0; i < 10; i++)

{

//使用纹理创建精灵帧

//第一个参数:纹理

//第二个参数:矩形

CCSpriteFrame* frame = CCSpriteFrame::createWithTexture(texture,

//第一个参数:矩形的x坐标

//第二个参数:矩形的y坐标

//第三个参数:矩形的宽度

//第四个参数:矩形的高度

CCRect(i*18, 0, 18, 32));

arr->addObject(frame);

}

//使用精灵帧创建动画

//第一个参数:数组

//第二个参数:动画的帧数(播放两张图片的间隔时间)

CCAnimation* animation = CCAnimation::createWithSpriteFrames(arr, 0.1f);

CCAnimate* animate = CCAnimate::create(animation);

//播放动画

//CCRepeatForever::create动画播放无限次

sp->runAction(CCRepeatForever::create(animate));

return true;

}

执行结果:



程序2:有plist文件的动画加载

首先需要在工程目录下的Resource文件夹中放一张有各种不同动作的图片和一个plist文件



plist格式的文件实际上是一个XML文件,文件中的内容

[cpp] view
plaincopy





<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>frames</key>

<dict>

<key>Boom_1.png</key>

<dict>

<key>frame</key>

<string>{{204,305},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_10.png</key>

<dict>

<key>frame</key>

<string>{{103,307},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_11.png</key>

<dict>

<key>frame</key>

<string>{{103,206},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_12.png</key>

<dict>

<key>frame</key>

<string>{{105,2},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_13.png</key>

<dict>

<key>frame</key>

<string>{{103,105},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_14.png</key>

<dict>

<key>frame</key>

<string>{{2,2},{101,101}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{101,101}}</string>

<key>sourceSize</key>

<string>{101,101}</string>

</dict>

<key>Boom_15.png</key>

<dict>

<key>frame</key>

<string>{{2,408},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_16.png</key>

<dict>

<key>frame</key>

<string>{{2,307},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_17.png</key>

<dict>

<key>frame</key>

<string>{{2,206},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_18.png</key>

<dict>

<key>frame</key>

<string>{{2,105},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_2.png</key>

<dict>

<key>frame</key>

<string>{{204,204},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_3.png</key>

<dict>

<key>frame</key>

<string>{{406,103},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_4.png</key>

<dict>

<key>frame</key>

<string>{{305,103},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_5.png</key>

<dict>

<key>frame</key>

<string>{{204,103},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_6.png</key>

<dict>

<key>frame</key>

<string>{{408,2},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_7.png</key>

<dict>

<key>frame</key>

<string>{{307,2},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_8.png</key>

<dict>

<key>frame</key>

<string>{{206,2},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

<key>Boom_9.png</key>

<dict>

<key>frame</key>

<string>{{103,408},{99,99}}</string>

<key>offset</key>

<string>{0,0}</string>

<key>rotated</key>

<false/>

<key>sourceColorRect</key>

<string>{{0,0},{99,99}}</string>

<key>sourceSize</key>

<string>{99,99}</string>

</dict>

</dict>

<key>metadata</key>

<dict>

<key>format</key>

<integer>2</integer>

<key>realTextureFileName</key>

<string>PFBoom.png</string>

<key>size</key>

<string>{512,512}</string>

<key>textureFileName</key>

<string>PFBoom.png</string>

</dict>

</dict>

</plist>

程序代码:

[cpp] view
plaincopy





#include "Animation.h"

CCScene* Animation::scene()

{

CCScene* s = CCScene::create();

Animation* layer = Animation::create();

s->addChild(layer);

return s;

}

//有plist文件的动画加载

bool Animation::init()

{

CCLayer::init();

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

//创建精灵

CCSprite* sp = CCSprite::create();

sp->setPosition(ccp(winSize.width / 2, winSize.height / 2));

addChild(sp);

//精灵放大4倍

sp->setScale(4);

//创建精灵帧缓存

CCSpriteFrameCache* frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();

//创建数组

CCArray* arr = CCArray::create();

//添加Plist文件

frameCache->addSpriteFramesWithFile("PFBoom.plist");

for (int i = 1; i <= 18; i++)

{

char key[128];

//通过名字获取精灵帧所在的图片

sprintf(key, "Boom_%d.png", i);

//将图片添加到精灵帧中

CCSpriteFrame* frame = frameCache->spriteFrameByName(key);

//将精灵帧添加到数组中

arr->addObject(frame);

}

//使用数组创建动画

CCAnimation* animation = CCAnimation::createWithSpriteFrames(arr, 0.1f);

CCAnimate* animate = CCAnimate::create(animation);

//动画消失

CCCallFunc* callfunc = CCCallFunc::create(sp, callfunc_selector(CCSprite::removeFromParent));

CCSequence* seq = CCSequence::create(animate, callfunc, NULL);

//播放动画

sp->runAction(seq);

return true;

}

执行结果:



程序3:通过鼠标实现动画切换

首先创建一个Animation类

在AnimationPreload.h中添加下面代码

[cpp] view
plaincopy





#ifndef __AnimationPreload_H__

#define __AnimationPreload_H__

#include "cocos2d.h"

USING_NS_CC;

class AnimationPreload : public CCLayer

{

public:

static CCScene* scene();

bool init();

CREATE_FUNC(AnimationPreload);

bool ccTouchBegan(CCTouch*, CCEvent*);

CCSprite* sp;

};

#endif

在AnimationPreload.cpp中添加下面的代码

[cpp] view
plaincopy





#include "AnimationPreload.h"

CCScene* AnimationPreload::scene()

{

CCScene* s = CCScene::create();

AnimationPreload* layer = AnimationPreload::create();

s->addChild(layer);

return s;

}

bool AnimationPreload::init()

{

//chushihu

CCLayer::init();

//获取窗口的大小

CCSize winSize = CCDirector::sharedDirector()->getWinSize();

//(创建纹理)从纹理里扣了10帧frame,组成数组

CCTexture2D* texture = CCTextureCache::sharedTextureCache()->addImage("walkLeft.png");

//创建数组

CCArray* arr = CCArray::create(); //retain

for (int i = 9; i >= 0; i--)

{

//创建精灵帧

CCSpriteFrame* frame = CCSpriteFrame::createWithTexture(texture,

CCRect(i*18, 0, 18, 32));

//将精灵帧添加到数组中

arr->addObject(frame);

}

// 通过数组创建动画

CCAnimation* animation = CCAnimation::createWithSpriteFrames(arr, 0.05f);

// 加入到缓存

CCAnimationCache::sharedAnimationCache()->addAnimation(animation, "MarioRun");

/***************************************************************/

/** 有plist文件的动画加载 **/

//创建精灵帧缓存

CCSpriteFrameCache* frameCache = CCSpriteFrameCache::sharedSpriteFrameCache();

//创建数组

arr = CCArray::create();

//将plist文件添加到精灵帧缓存中

frameCache->addSpriteFramesWithFile("PFBoom.plist");

for (int i = 1; i <= 18; i++)

{

char key[128];

//通过名字获取精灵帧所在的图片

sprintf(key, "Boom_%d.png", i);

//将图片添加到精灵帧中

CCSpriteFrame* frame = frameCache->spriteFrameByName(key);

//将精灵帧添加到数组中

arr->addObject(frame);

}

//创建动画

animation = CCAnimation::createWithSpriteFrames(arr, 0.1f);

// 加入到缓存

CCAnimationCache::sharedAnimationCache()->addAnimation(animation, "PlaneBOOM");

sp = CCSprite::create();

sp->setPosition(ccp(winSize.width / 2, winSize.height / 2));

addChild(sp);

//精灵方法4倍

sp->setScale(4);

// setTouch

setTouchEnabled(true);

setTouchMode(kCCTouchesOneByOne);

return true;

}

bool AnimationPreload::ccTouchBegan(CCTouch*, CCEvent*)

{

sp->stopAllActions();

static int i = 1;

if (i == 1)

{

sp->runAction(CCAnimate::create(

CCAnimationCache::sharedAnimationCache()->animationByName("PlaneBOOM")

));

}

else

{

sp->runAction(CCAnimate::create(

CCAnimationCache::sharedAnimationCache()->animationByName("MarioRun")

));

}

i = 1 - i;

return 0;

}

执行结果:

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