Date: 2016/4/8 Cate: cocos2d-x Tags:  

cocos2d-xでゲーム開発をしていて、海外展開するときに、中国語やハングルなんかは使っているフォントに入っていない時があったりします。
なので言語ごとにフォントを使い分けたりするのですが、今回は他のユーザーとコミュニケーションする機能があり、他のユーザーの名前を表示するときにフォントにユーザーの名前に使われている文字が含まれているか確認する必要がありました。
なので、Labelを生成するときにフォントに文字が含まれているか確認する方法を実装したのでメモ。
ちなみにcocos2d-xのバージョンはv3.3です。

含まれていない文字があるか確認する

auto label = Label::createWithTTF("hoge", "some_font.ttf", 20.f)みたいに、TTFをつかったラベルをcreateする際、CCLabelTextFormatter.cppcreateStringSprites()で、フォントが含まれているかチェックをしているようです。
もし含まれていない場合、ログにWARNING: can't find letter definition in font file for letter:と含まれていない文字が表示されます。
ということで、これを応用すればLabelを生成した後に含まれていない文字があるのか確認できそうです。

Labelクラスをいじる

というわけで、Labelクラスをいじりました。int checkCharacters()みたいなpublicメソッドを追加して、

int Label::checkCharacters()
{
    this->updateContent(); // 先にコレを呼んでおく
    int missing = 0;
    for(int i = 0; i < _currentUTF16String.size(); ++i){
        auto c = _currentUTF16String[i];
        FontLetterDefinition tempDefinition;
        _fontAtlas->getLetterDefinitionForChar(c, tempDefinition);
        if (!tempDefinition.validDefinition) {
            ++missing;
        }
    }
    return missing;
}

こんな感じで含まれていない文字数をチェックできるようにしました。
で、

auto label = Label::createWithTTF("hoge", "some_font.ttf", 20.f)
int missing = label->checkCharacters();
if(missing > 0){
   label = Label::createWithSystemFont("hoge", "Arial", 20.f)
}

てなかんじで含まれていない文字がある場合SytemFontに変更するようにしました。
あるいはもし複数のフォント(中国語用フォント、ハングル用フォントなど)がアプリにある場合は、含まれていない文字の数が一番少ないフォントを調べて、それを使用する、というかんじにも出来るかと思います。

Leave a Reply