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

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

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

文字の改行

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

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

仕組み

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

for(NSUInteger i=0; i < stringLen-1;i++) {
		unichar c = &#91;string_ characterAtIndex:i&#93;;
		if( c=='\n')
			quantityOfLines++;
        
	}
}

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


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

文字の色を変える

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

2013 2 13 2233

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

CCLabelBMFontをカスタマイズする

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

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

 //
        //変更2013 2/13 &#91;&#93;で囲まれた文字を配列に格納
        //continueを使えば文字を飛ばすことができる。正確に言うと、下記にあるaddchildに取り込まれなくなる。
        
        if (c == '&#91;') {
            
            on = YES;
            continue;
            
        }
        
        
        if (c == '&#93;') {
            
            on = NO;
            continue;
            
        }
        
        
        if(on){
            //NSMutableArrayを一つ作成し、文字の番号を格納していきます。
            &#91;changecolorstring addObject:&#91;NSNumber numberWithInteger:i&#93;&#93;;
            
            
        }
&#91;/c&#93;

<span style ="font-weight:800; color:#0033cc;">[追記 2013 4/1]</span>
CCLabelBMFontクラス内に、上記で格納した配列を取り出すメソッドを作成します。

//オリジナルのメソッドをCCLabelBMFontに作成ます。
//これを、呼び出すことで、文字を変えたい配列を取り出すことができます。
-(NSMutableArray*)returnfontArray{
    
    return changecolorstring;
    
    
}



文字を出力する際の設定

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

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

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

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

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

  //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)];

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

さいごに

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

考え方としては,
  • 特定の文字を選ぶ
  • 選んだ文字の色を変える
この2つです。

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

Related Posts Plugin for WordPress, Blogger...