2012年5月7日月曜日

cocos2d: <初級>スコア表示をローカライズしてみよう

ゲームでスコア表示する時に「1000点」とか「1000pts」など、言語環境によって変えたい時があります。
これらはどうやって実現するのでしょうか?
English

Japanease
iOSでしたら、NSString:stringWithFormat:で文字列を生成する時のフォーマットを、ローカライズしておくのが一番でしょう。
今回はCocos2dのテープレートのHelloWorldプロジェクトを修正して説明します。

Localizable.stringsの追加

Localizable.stringsを新規にプロジェクトに追加します。
Localizable.strings
そして、NavigatorパネルでLocalizable.stringファイルを選択した状態で、UtilitiesパネルのLocalization項目から英語、日本語を+ボタンで追加してやります。
これでファイルが英語用と日本語用の2つに分割されました。
Utilities
Navigatorパネルでは、以下のように表示されます。
Localized
そして英語用のLocalizable.stringsには
"Score Singular" = "%dpt";
"Score Plural" = "%dpts";
日本語用には
"Score Singular" = "%d点";
"Score Plural" = "%d点";
と記述しておきます。
= の左側が検索キーで、右側が値です。

なお、Singularとは単数形で、Pluralとは複数形のことです。
英語用の場合、複数形の時にsがついてptsと表示するようにします。

日本語にはこういった区別がないので複数形を用意する必要はないのですが、プログラム処理を統一するために、あえて同じフォーマットでデータを用意しています。
こういった一般化は、ローカライズする言語が、5つや10などに増える毎に威力を発揮します。

HelloWorldLayerクラスの編集

次に、HelloWorldLayer.hに使用する変数を定義していきます。
@interface HelloWorldLayer : CCLayer
{
    ccTime wait;
    int score;
    CCLabelTTF *scoreLabel;
}
CCLabelTTFクラスはiOS内蔵フォントを使って、簡単にラベルを描画できるクラスです。

HelloWorldLayer.mのinitメソッドは以下のような感じにします。
フレーム毎にスコアを更新させるので、最後にscheduleUpdateを呼び出しています。
-(id) init
{
    if( (self=[super init])) {
        // ask director the the window size
        CGSize size = [[CCDirector sharedDirector] winSize];
        
        // 背景カラーレイヤー
        CCLayerColor *backColorLayer = [CCLayerColor layerWithColor:ccc4(76,215,255,255) width:size.width height:size.height];
        [self addChild:backColorLayer];

        // ラベル。画面中央に表示
        scoreLabel = [CCLabelTTF labelWithString:@"" fontName:@"HelveticaNeue" fontSize:32];
        scoreLabel.position =  ccp( size.width /2 , size.height/2 );
        [self addChild: scoreLabel];
        
        // スコアとスコアをカウントダウンする用のウェイト変数の初期化
        wait = 0;
        score = 30;

        [self scheduleUpdate];
    }
    return self;
}

フレーム毎に呼び出される処理はupdateメソッドに記述します。
- (void)update:(ccTime)delta
{
    NSString *format = score==1 ? NSLocalizedString(@"Score Singular",@"") : NSLocalizedString(@"Score Plural",@"");
    NSString *str = [NSString stringWithFormat:format,score];

    [scoreLabel setString:str];
    
    wait += delta;
    if (wait>=0.5f) {  // 0.5秒おきにscoreをカウントダウン
        --score;
        if (score<0) {
            score = 30;
        }
        wait = 0;
    }
}
肝の部分が、format変数を初期化する部分です。
scoreが1の時は、: の左側の処理が実行され、1以外の時は : の右側の処理が実行されます。

ここでは、1の時は単数形のフォーマットを用い、1以外の時は複数形のフォーマットを用いてラベルの文字列を作成しています。英語の場合、0は複数形を用いるのでこのようにしました。

NSLocalizedString()は、第1パラメータで指定した文字列を検索キーとして、Localizable.stringsファイルから文字列を取得する標準マクロです。

この時、検索されるLocallizable.stringsファイルは、iOSの設定アプリで設定されている言語環境を元に決定されます。
日本語環境なら日本語用のLocalizable.stringsが、英語環境なら英語用のLocalizable.stringsが検索対象になります。

おすすめ

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...