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で利用できるフォントデータが簡単に作れるのですが、その際に色は全部同じ色になってしまいます。[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] こんな感じでやれば色を特定の文字を変えることができます。
さいごに
「色を変える」は私は独自に考えたものです。 もっとスマートなやり方があるかもしれないのですが、これを使えば特定の文字を変えることができました。(もしかしたら、色を変えるのはCCLabelBMFontでできるかもしれません)考え方としては,
- 特定の文字を選ぶ
- 選んだ文字の色を変える
もっといいやり方があれば、是非教えて下さい。