2014年1月27日月曜日

【cocos2d-x 2.2】はみ出さないCCLabelBMFont

最近作ってるゲームではBitMapFontしか使ってません。
cocos2d-xなので、CCLabelBMFontを使ってるのですが、widthに合わせて文字がちっちゃくなったりしないので、
文字数オーバーすると画面からはみ出たりでめんどくさいです。
というわけで、widthを制限して超えると縮むラベルを作りました。
見づらいけど、全文記載します。

ScaleLabelBMFont.h
#ifndef __ScaleLabelBMFont__NODE_H__
#define __ScaleLabelBMFont__NODE_H__

#include "cocos2d.h"

USING_NS_CC;


class ScaleLabelBMFont : public CCLabelBMFont
{
public:
    static ScaleLabelBMFont* create(const char *str, const char *fntFile, float limitWidth, float currentScale);
 virtual bool init(const char *str, const char *fntFile, float limitWidth, float currentScale);
    virtual void updateLabel();
    
    CC_SYNTHESIZE(float, _limitWidth, LimitWidth);
    CC_SYNTHESIZE(float, _currentScale, CurrentScale);
};

#endif // __ScaleLabelBMFont__NODE_H__

ScaleLabelBMFont.cpp
#include "ScaleLabelBMFont.h"

ScaleLabelBMFont* ScaleLabelBMFont::create(const char *str, const char *fntFile, float limitWidth, float currentScale)
{
    ScaleLabelBMFont * pRet = new ScaleLabelBMFont();
    if (pRet && pRet->init(str, fntFile, limitWidth, currentScale)) {
        pRet->autorelease();
    } else {
        CC_SAFE_DELETE(pRet);
    }
    return pRet;
}

bool ScaleLabelBMFont::init(const char *str, const char *fntFile, float limitWidth, float currentScale)
{
 if ( !CCLabelBMFont::initWithString(str, fntFile) )
 {
  return false;
 }
    
    _limitWidth = limitWidth;
    _currentScale = currentScale;
    setScale(_currentScale);

 return true;
}

void ScaleLabelBMFont::updateLabel()
{
    CCLabelBMFont::updateLabel();
    if ((getContentSize().width * _currentScale) > _limitWidth) {
        float scaleX = _limitWidth / getContentSize().width;
        if (getScaleX() != scaleX) {
            setScaleX(scaleX);
        }
    }
}