Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; comment_reply_notification has a deprecated constructor in /home/wwwroot/hector/www.yiwuye.com/wp-content/plugins/comment-reply-notification/comment-reply-notification.php on line 13
小技巧,让cocos2d-x支持多语言Plist图片 « 一梧叶

小技巧,让cocos2d-x支持多语言Plist图片

 - by Hector

小技巧,让cocos2d-x支持多语言Plist图片

之前看到有人在cocoachina的论坛问这个问题,正巧处理过这个问题,记录一下。

cocos2d-x加载plist图片之后,将纹理放在TextureCache里面,SpriteFrameCache存储了图片名称和纹理的对应关系。

跟踪代码不难发现,所有动画,UI最后或者纹理都是通过图片plist里面的名称来查找纹理的,最终调用的是这个方法:

SpriteFrame* SpriteFrameCache::getSpriteFrameByName(const std::string& name) 其中name,就是plist里面的key。

那么实现方式很简单了,我们在图片后面加上语言后缀,比如-zh.png,-en.png,在SpriteFrameCache添加一个std::vector<std::string> _fileExts;数组,然后修改上面那个函数即可

SpriteFrame* SpriteFrameCache::getSpriteFrameByName(const std::string&amp; name)
{
    SpriteFrame* frame = nullptr;
    for (string&amp; ext:_fileExts) {
        string nametemp = name;
        int pos = nametemp.rfind(".");
        nametemp.insert(pos,ext);
        frame = _spriteFrames.at(nametemp);
        if (frame) {
            return frame;
        }
    }
    if (!frame)
        frame = _spriteFrames.at(name);
…………………………
}

因为纹理已经在内存里面了,切换语言后,清空原来的多语言后缀,新加现语言的后缀即可。逻辑和代码都十分简单,就不再仔细描述了。。。

Leave a comment