猴子原创,欢迎转载。转载请注明:转载自Cocos2D开发网--Cocos2Dev.com,谢谢!
很早以前我写过了创建动画的一些方式,那都是1.x版本的时候,现在总有人问我,说创建不了动画,代码有问题。
2.x之后改了一些函数,其实出错了,自己看下应该会改的。
我今天就把创建动画的几种方式写一下。我封装了这个类,大家导入自己工程,静态方法调用就可以了。
头文件BYAnimationTool.h
//
// BYAnimationTool.h
// COG
//
// Created by Yanghui Liu on 12-7-26.
// Copyright (c) 2012年 BoyoJoy. All rights reserved.
//
#ifndef COG_BYAnimationTool_h
#define COG_BYAnimationTool_h
#include "cocos2d.h"
USING_NS_CC;
class BYAnimationTool {
public:
static CCActionInterval* createAnimFormSwf(const char* swfName);
static CCActionInterval* createAnimFormSwf(const char* swfName,float frameTime);
static CCActionInterval* createRFAnimFormSwf(const char* swfName);
static CCActionInterval* createRFAnimFormSwf(const char* swfName,float frameTime);
static CCActionInterval* createRFAnimFormPng(const char* pngName,const char* frameName,int beginFrameIndex);
};
#endif
BYAnimationTool.cpp文件
//
// BYAnimationTool.cpp
// COG
//
// Created by Yanghui Liu on 12-7-26.
// Copyright (c) 2012年 BoyoJoy. All rights reserved.
//
#include "BYAnimationTool.h"
#define kDelayPerUnit 0.08f
//将SWF转成一次性动画
CCActionInterval* BYAnimationTool::createAnimFormSwf(const char* swfName){
return createAnimFormSwf(swfName,kDelayPerUnit);
}
//将SWF转成一次性动画
CCActionInterval* BYAnimationTool::createAnimFormSwf(const char* swfName,float frameTime){
char str1[100] = {0};
char str2[100] = {0};
CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
sprintf(str1, "%s.plist", swfName);
sprintf(str2, "%s.pvr.ccz", swfName);
cache->addSpriteFramesWithFile(str1,str2);
CCArray* animFrames = CCArray::create();
int i = 0;
do {
sprintf(str2, "%s.swf/%04d", swfName,i);
CCSpriteFrame *frame = cache->spriteFrameByName(str2);
if (frame) {
animFrames->addObject(frame);
}else {
break;
}
} while (++i);
CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, frameTime);
cache->removeSpriteFramesFromFile(str1);
return CCAnimate::create(animation);
}
//将SWF转成永久性动画
CCActionInterval* BYAnimationTool::createRFAnimFormSwf(const char* swfName){
return createRFAnimFormSwf(swfName,kDelayPerUnit);
}
//将SWF转成永久性动画 可以自定义帧率
CCActionInterval* BYAnimationTool::createRFAnimFormSwf(const char* swfName,float frameTime){
return CCRepeatForever::create(createAnimFormSwf(swfName,frameTime));
}
//将PNG序列图转成永久性动画
CCActionInterval* BYAnimationTool::createRFAnimFormPng(const char* pngName,const char* frameName,int beginFrameIndexe){
char str1[100] = {0};
char str2[100] = {0};
CCSpriteFrameCache *cache = CCSpriteFrameCache::sharedSpriteFrameCache();
sprintf(str1, "%s.plist", pngName);
sprintf(str2, "%s.pvr.ccz", pngName);
cache->addSpriteFramesWithFile(str1,str2);
CCArray* animFrames = CCArray::create();
int i = beginFrameIndexe;
do {
sprintf(str2, "%s%04d.png", frameName,i);
CCSpriteFrame *frame = cache->spriteFrameByName(str2);
if (frame) {
animFrames->addObject(frame);
}else {
break;
}
} while (++i);
CCAnimation *animation = CCAnimation::createWithSpriteFrames(animFrames, kDelayPerUnit);
cache->removeSpriteFramesFromFile(str1);
return CCRepeatForever::create(CCAnimate::create(animation));
}
简单写了下注释,应该看得懂的。
使用方法:
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite* sprite = CCSprite::create();
sprite->setPosition(ccp(winSize.width*.5,winSize.height*.5));
addChild(sprite);
sprite->runAction(BYAnimationTool::createRFAnimFormSwf("test"));
BYAnimationTool::createRFAnimFormSwf("test") 是创建一个永久性重复播放的动画。
注意:
1、所有方法传入的文件名不要后缀。
2、png和swf是我使用了TexturePaker压缩了的。