【问题标题】:Preload spritsheet asynchronously in cocos2d-x 3 and use itcocos2d-x 3中异步预加载spritsheet并使用
【发布时间】:2014-07-09 12:42:30
【问题描述】:

这是正确的异步预加载 spritesheet 并在移除加载屏幕后在其他场景中适当使用的方法吗?

   // load the texture into the cache 
   Director::getInstance()->getTextureCache()->addImageAsync("ingame.png", 
    [](cocos2d::Texture2D *texture) {

        SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ingame.plist", texture);

        // here remove loading screen and go to ingame scene to use the loaded spritesheet
    }
);


    // use the loaded spritesheet in ingame scene
    auto bg = Sprite::createWithSpriteFrameName("ingame_bg.png");
    bg->setPosition(origin + visibleSize / 2);
    addChild(bg, 0);

据我了解,在调用 addImageAsync 后,.png 文件被加载到 GPU 的内存中,但目前还没有关于 spritesheet 中图像位置的信息。因此我们也调用SpriteFrameCache::getInstance()->addSpriteFramesWithFile("ingame.plist", texture); 要求cocos2d-x 解析.plist 文件并了解spritesheet 中的图像在哪里。是否有意义?

【问题讨论】:

  • 我只是这样做:SpriteFrameCache::getInstance()->addSpriteFramesWithFile("sprites.plist");
  • 但是不会预加载,对吧?请告诉我我关于这些功能是对还是错的结论?
  • 如果您查看addSpriteFramesWithFile() 的源代码,它肯定会预加载。

标签: c++ cocos2d-x cocos2d-x-3.0


【解决方案1】:

如上所述,addSpriteFramesWithFile() 会为您进行预加载。

查看来源:

Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(texturePath.c_str());

if (texture)
{
    addSpriteFramesWithDictionary(dict, texture);
    _loadedFileNames->insert(pszPlist);
}
else
{
    CCLOG("cocos2d: SpriteFrameCache: Couldn't load texture");
}

【讨论】:

  • 深入查看源代码:在这个TextureCache::addImage( 函数中,如果地图已经加载,它会从地图获取纹理,而不是再次加载。
  • 可以肯定,你是说看看这个函数:Texture2D * TextureCache::addImage(const std::string &path)
  • 是的,完全正确!这是addSpriteFramesWithFile中使用的那个。
  • 好的,让我再看一下,在我看来它正在创建一个新的 Texture2D。
  • 根据 Cocos2d-x 团队的说法,如果 SpriteFrames 不存在,它会预加载它们。
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多