enchant.jsの enchant.ui.MutableText を拡張してみました。
・フォントテクスチャをコンストラクタで指定できるように。(コンストラクタで座標指定は削除)
・スケール(scaleX scaleY)に対応。
参考までにペタリ。
var MyMutableText = enchant.Class.create(enchant.Sprite, {
/*!
コンストラクタ
@param fontTexture テクスチャ
@param fontTextureUnitSize テクスチャの1文字のサイズ
*/
initialize: function(fontTexture, fontTextureUnitSize) {
enchant.Sprite.call(this, 0, 0);
this.fontSize = fontTextureUnitSize ? fontTextureUnitSize : 16; // テクスチャの1文字サイズ
this.widthItemNum = 16; // テクスチャの1列に何文字格納されてるか
this.x = 0;
this.y = 0;
this.m_fontTexture = fontTexture;
this._imageAge = Number.MAX_VALUE;
this.text = '';
if (arguments[2]) {
this.row = Math.floor(arguments[2] / this.fontSize);
}
},
/**
* ラベルの内容を書き換える関数
* @param txt
*/
setText: function(txt) {
var i, x, y, wNum, charCode, charPos;
var fontDstWidth = this.fontSize * this.scaleX;
var fontDstHeight = this.fontSize * this.scaleY;
this._text = txt;
var newWidth;
if (!this.returnLength) {
this.width = Math.min(fontDstWidth * this._text.length, enchant.Game.instance.width);
} else {
this.width = Math.min(this.returnLength * fontDstWidth, enchant.Game.instance.width);
}
this.height = fontDstHeight * (Math.ceil(this._text.length / this.row) || 1);
// if image is to small or was to big for a long time create new image
if(!this.image || this.width > this.image.width || this.height > this.image.height || this._imageAge > 300) {
this.image = new enchant.Surface(this.width, this.height);
this._imageAge = 0;
} else if(this.width < this.image.width || this.height < this.image.height) {
this._imageAge++;
} else {
this._imageAge = 0;
}
this.image.context.clearRect(0, 0, this.width, this.height);
for (i = 0; i < txt.length; i++) {
charCode = txt.charCodeAt(i);
if (charCode >= 32 && charCode <= 127) {
charPos = charCode - 32;
} else {
charPos = 0;
}
x = charPos % this.widthItemNum;
y = (charPos / this.widthItemNum) | 0;
this.image.draw( this.m_fontTexture, // テクスチャ
x * this.fontSize, y * this.fontSize, // 入力xy
this.fontSize, this.fontSize, // 入力wh
(i % this.row) * fontDstWidth, ((i / this.row) | 0) * fontDstHeight, // 出力xy
fontDstWidth, fontDstHeight ); // 出力wh
}
},
/**
* ラベルの内容
* @type {String}
*/
text: {
get: function() {
return this._text;
},
set: function(txt) {
this.setText(txt);
}
},
/**
* @type {Number}
*/
row: {
get: function() {
return this.returnLength || this.width / this.fontSize;
},
set: function(row) {
this.returnLength = row;
this.text = this.text;
}
}
});