3

私は最近使用することを学んでいます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ファイルにスプライトフレームが付随するかを知る方法があるかどうか疑問に思っていました。私はそれを行うことができますか?どのように?

plistつまり、ファイル名のみを知っているアニメーションをロードできる汎用クラスを作成したいと考えています。何かのようなもの:

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

2 に答える 2

3

CCDictionaryロードされたplistファイルからのビルドを解決しました:

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);

}
于 2012-08-30T13:56:47.020 に答える
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

hero = 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) ) );
于 2014-05-30T06:40:23.193 に答える