2012-08-30 27 views
3

这些天我正在学习使用cocos2dx。 由于现在我已经能够加载和播放保存为.plist文件的精灵动画。 我加载动画这种方式:在Cocos2dx中通过plist文件加载动画

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("oras.plist"); 
CCAnimation *bearWalkingAnimation = CCAnimation::create(); 

for (int i = 0 ; i < 8 ; ++i) 
{ 

    std::stringstream ss; 
    ss << "bear" << i + 1 << ".png"; 

    std::string name = ss.str(); 
    CCSpriteFrame* sprite = CCSpriteFrameCache::sharedSpriteFrameCache()>spriteFrameByName(name.c_str()); 
    bearWalkingAnimation->addSpriteFrame(sprite); 

} 

我依靠的事实,我知道图片的名字,但我现在试图组织一点点我的代码。

我想知道是否有任何知道在加载时哪个plist文件appertain sprite帧。我能做到吗?怎么做?

换句话说,我想写一个通用类,只能知道文件名plist加载动画。喜欢的东西:

void MyLoaderClass::LoadAnimation(std::string plist_file_name){ ....} 

回答

3

我已经解决了从建装plist文件CCDictionary

CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(fileName.c_str()); 

mAnimation = CCAnimation::create(); 

CCFileUtils *fileUtils = CCFileUtils::sharedFileUtils(); 
const char *fullPath = fileUtils->fullPathFromRelativePath(fileName.c_str()); 


CCDictionary *dictionary = CCDictionary::createWithContentsOfFileThreadSafe(fullPath); 
CCDictionary *framesDict = static_cast<CCDictionary*> (dictionary->objectForKey("frames")); 

CCArray *keys = framesDict->allKeys(); 

for (int i = 0 ; i < keys->count(); ++i) 
{ 
    CCString *spriteFileName = static_cast<CCString *> (keys->objectAtIndex(i)); 
    CCSpriteFrame* sprite = CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(spriteFileName->getCString()); 
    mAnimation->addSpriteFrame(sprite); 

} 
1

//"horse.png”通过一批节点箱

CCSpriteBatchNode* spritebatch = CCSpriteBatchNode::create("horse.png"); 
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache(); 
cache->addSpriteFramesWithFile("horse.plist"); 

// "hero" is CCSprite and "horse_1.png" is a sprite in "horse.png" batch node 

英雄= CCSprite :: createWithSpriteFrameName(“horse_1.png”);

addChild(spritebatch); 
spritebatch->addChild(hero); 

CCLog("In the anim2"); 

CCArray* animFrames = CCArray::createWithCapacity(16); 
char str[100] = {0}; 
for(int i = 1; i < 16; i++) 
{ 
    // in my batch node all the sprite name as 'horse_1.png', 'horse_2.png'..... 
    sprintf(str, "horse_%i.png", i); 
    CCSpriteFrame* frame = cache->spriteFrameByName(str); 
    animFrames->addObject(frame); 
} 
CCAnimation* animation = CCAnimation::createWithSpriteFrames(animFrames, .1f); 
animation->setRestoreOriginalFrame(true); 
hero->runAction(CCRepeatForever::create(CCAnimate::create(animation)));