CCLabelBMFontで「改行」や「特定の文字の色を変える」方法

CCLabelBMFontを使って文字を出力する際、同じ色の文字ばかりでは面白くない! 重要な言葉は色を変えて表現したい! 今回はCCLabelBMFontをカスタマイズをして、「改行」や「特定の文字の色を変える」方法を案内します。 [4/1 記事を少し追記しました]

文字の改行

cocos2dのver2から、ディフォルトでも文字を「改行できる」ようになりました。 文字にしているNSString内で、[\n]をつけた所が開業されます。

こんな形でしていします。 [c] NSString *messageString =@"あそこの青い光に入ると、\nいろいろな所へいけるぜ!"; [/c]

仕組み

この改行がどういった仕組みなのか、それはCCLabelBMFontを見ればわかります。 [c] //CCLabelBMFontクラス:736行目

for(NSUInteger i=0; i < stringLen-1;i++) { unichar c = [string_ characterAtIndex:i]; if( c=='\n') quantityOfLines++;

}

}

//750行目 if (c == '\n') { nextFontPositionX = 0; nextFontPositionY -= configuration->commonHeight; continue; }

[/c]

これが、改行の仕組みです。 cocos2dのver1の時は、自作で設置をしないといけないのですが、ver2の場合は何もしないでも「改行」が利用できます。

文字の色を変える

私は「GlyphDesigner」で作ったフォントを利用しています。 これを使えばcocos2dで利用できるフォントデータが簡単に作れるのですが、その際に色は全部同じ色になってしまいます。

2013 2 13 2233

[GlyphDesignerについてはこちらを確認ください]

CCLabelBMFontをカスタマイズする

では、どうすればいいのか? 私が考えたのが、「改行」と同じようにCCLabelBMFontをカスタマイズすれば設定できないかということです。

CCLabelBMFont.m内 [c] //740行目あたりのfor文に記載します。 for(NSUInteger i = 0; i<stringLen; i++) { unichar c = [string_ characterAtIndex:i];

// //変更2013 2/13 []で囲まれた文字を配列に格納 //continueを使えば文字を飛ばすことができる。正確に言うと、下記にあるaddchildに取り込まれなくなる。

    if (c == '[') {

        on = YES;
        continue;

    }


    if (c == ']') {

        on = NO;
        continue;

    }


    if(on){
        //NSMutableArrayを一つ作成し、文字の番号を格納していきます。
        [changecolorstring addObject:[NSNumber numberWithInteger:i]];


    }

[/c]

[追記 2013 4/1] CCLabelBMFontクラス内に、上記で格納した配列を取り出すメソッドを作成します。 [c] //オリジナルのメソッドをCCLabelBMFontに作成ます。 //これを、呼び出すことで、文字を変えたい配列を取り出すことができます。 -(NSMutableArray*)returnfontArray{

return changecolorstring;

}

[/c]

文字を出力する際の設定

CCLabelBMFontで構成されている文字は全てCCSpriteクラスで表現されています。 まずは、どの文字の色を変えたいかを決めます。

[c] NSString *messageString =@"あそこの[青い光]に入ると、\nいろいろな所へいけるぜ!"; [/c] こんなNSStringを用意します。 見ていただければわかると思いますが、私は[]で囲まれた文字の色を変えるようにしています。

こうすれば、どの文字の色を変えたいかを配列(NSMutableArray)に格納できます。

後は、配列(NSMutableArray)をCCLabelBMFontから呼び出して、色を変えてあげればいいのです。 コードはこれが正しいかわかりませんが、上手く行っているので記載します。

[c] //文字の色を変える処理一覧

  //CCLabelBMFont *message

int i = 0;
//CCLabelBMFontクラスから、先ほど格納した配列を呼び出します。
NSMutableArray *array = [message returnfontArray];

for (id c in message.children){

    i += 1;

    //色を変えたい文字の順番を取り出す
    for (NSString *cjd in array){

        int j = [cjd intValue];

        //j=j+1;


        //文字の順番があっていれば、setColorを使って色を変える
        if(i == j){

            CCSprite *chid = (CCSprite*)c;


            //赤い色に塗っています。
            [chid setColor:ccc3(255, 0, 0)];


            }
      }
 }

[/c] 2013_2_13_4433.png こんな感じでやれば色を特定の文字を変えることができます。

さいごに

「色を変える」は私は独自に考えたものです。 もっとスマートなやり方があるかもしれないのですが、これを使えば特定の文字を変えることができました。(もしかしたら、色を変えるのはCCLabelBMFontでできるかもしれません)

考え方としては,

  • 特定の文字を選ぶ
  • 選んだ文字の色を変える
この2つです。

もっといいやり方があれば、是非教えて下さい。