cocos2dx中快速完成一段可播放动画
版本:cocos2dx 2.2.6
IDE: VS2012
语言:C++98
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithFile("walk.plist"); CCSprite* pSprite = CCSprite::createWithSpriteFrameName("zzlx1.JPG"); pSprite->setPosition(ccp(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2));
首先将图片资源加载到内存中去,用精灵帧缓存的方式来创建精灵。
精灵创建的方式有多种,但是精灵帧缓存创建精灵的方式最为常用,因为占用内存和效率。
相关知识:http://www.cnblogs.com/andyque/articles/1988097.html
pSprite精灵是动画帧的第一张图,接下来我们需要一个数组存储剩余的动画帧
CCArray* pArray = CCArray::create(); char name[20]; for (int i = 2;i <= 8; i++) { sprintf(name, "zzlx%d.JPG", i); pArray->addObject(cache->spriteFrameByName(name)); }
一共8张图,名称为zzlx1到zzlx8,这里有2点要注意的:
1.名称最好符合某种规律,否则需要一个字符串数组来存一个动画的动画帧名称。
2.这里JPG是大小写敏感的,我的图片名称结尾是大写JPG。如果代码中是小写则会出错。
数组创建好后,我们来创建Animation和Animate。
CCAnimation* pAnimation = CCAnimation::createWithSpriteFrames(pArray,0.1f); CCAnimate* pAnimate = CCAnimate::create(pAnimation); pSprite->runAction(CCRepeatForever::create(pAnimate)); this->addChild(pSprite);
Animation是动画,存储了所有的精灵帧和播放间隔。而Animate是动作,是Action。Action是作用于CCSprite的。
这里CCRepeatForever是循环播放,最后将pSprite加入层中。
全部代码:
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); cache->addSpriteFramesWithFile("walk.plist"); CCSprite* pSprite = CCSprite::createWithSpriteFrameName("zzlx1.JPG"); pSprite->setPosition(ccp(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2)); //精灵帧数组 CCArray* pArray = CCArray::create(); char name[20]; for (int i = 2;i <= 8; i++) { sprintf(name, "zzlx%d.JPG", i); pArray->addObject(cache->spriteFrameByName(name)); } CCAnimation* pAnimation = CCAnimation::createWithSpriteFrames(pArray,0.1f); CCAnimate* pAnimate = CCAnimate::create(pAnimation); pSprite->runAction(CCRepeatForever::create(pAnimate)); this->addChild(pSprite);
cocos2dx中的三种缓存
http://blog.csdn.net/star530/article/details/23612487
这里AnimationCache,动画缓存,参考资料中并没有写完整,使用动画缓存如果用一般的plist文件是不行的,需要特殊生成plist文件,
这样的plist文件会一个key对应一组图片,这样使用key就能载入一组完整的动画帧,播放动画。
最终效果