通过Cocos2dx中的plist文件加载动画
Loading animations through plist files in Cocos2dx
这些天我正在学习使用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){ ....}
我已经解决了从加载的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);
}
//"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) ) );
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 试图用c++制作一个动画加载圈
- 是否可以在QT GUI应用程序中处理事件时播放加载动画指示器?
- QML:设置动画图像源,而不加载资源中的文件
- 不规则的模型加载/动画
- 如何加载和显示动画png
- 通过Cocos2dx中的plist文件加载动画
- 如何在等待程序启动混乱/ GTK+时制作加载/介绍动画弹出窗口
- 如何在用c++编写的控制台应用程序中制作加载动画
- DrawIconEx和DrawIcon只绘制非动画的加载图标
- 不要加载网格和动画的名称
- 在Cocos2dx中加载动画中使用的同一SpriteFrame时减慢速度