Engine.DrawableText = class extends PIXI.Sprite
{
constructor(text, fontFamily, fontSize, align, spacing)
{
super();
this.style = new PIXI.TextStyle({
fontFamily: "Verdana",
fontSize: 12,
fill: "white",
resolution: 2,
});
this.normalText = new PIXI.Text();
this.multiText = null; // lazy
this.text.style = this.style;
this.addChild(this.text);
this.isMultiStyleText = false;
this.name = "DrawableText";
this.text.text = "";//"text";
this.styleTags = {"default": {}, "b": {fontStyle: "bold"}, "ml": {fontStyle: "italic", fill: "#ff8888"},"ms": {fontStyle: "italic", fill: "#4488ff"} };
if (typeof text === 'string')
{
this.setText(text, fontFamily, fontSize, align, spacing);
}
this.interactiveChildren = false;
//this.interactive = false;
}
get text()
{
if (this.isMultiStyleText) return this.multiText;
else return this.normalText;
}
setTint(color)
{
this.textColor = color;
}
get tint()
{
return this.textColor;
}
set tint(color)
{
this.textColor = color;
}
get textColor() { return this.style.fill; }
set textColor(value)
{
if (this.style != null && value !== undefined)
{
if (value.getHex) value = value.getHex();
this.style.fill = value;
this.text.text = this.text.text;
}
}
clearOverrideColors()
{
if (this.isMultiStyleText)
{
this.removeChild(this.text);
this.isMultiStyleText = false;
this.addChild(this.text);
for (var tag in Object.keys(this.styleTags.default))
{
this.style[tag] = this.styleTags.default[tag];
}
this.styleTags.default = {};
delete this.styleTags.highlight;
}
this.tint = Colors.white;
//this.fill = "white";
}
changeTextRangeColor()
{
//TODO
}
updateVertexColors()
{
//TODO
}
getFont()
{
return this.style.fontFamily;
}
getFontSize()
{
return this.style.fontSize;
}
getAlignment()
{
return this.style.align;
}
setGameObjectName(name)
{
this.name = name;
}
get x() { return super.x; }
set x(value) { super.x = Math.round(value); }
get y() { return super.y; }
set y(value) { super.y = Math.round(value); }
get width() { return this.text.width * Math.abs(this.scale.x); }
get height()
{
if (this.text.text == " ") { return 0; } // maintain parity with unity
return this.text.height * Math.abs(this.scale.y); //1.05 to maintain parity
}
get textLineHeight() { return this.height / this.numTextLines; }
get textAreaWidth() { return this.style.wordWrapWidth ? this.style.wordWrapWidth : 0; }
set textAreaWidth(value)
{
if (value == this.style.wordWrapWidth) return;
this.style.wordWrapWidth = value;
this.style.wordWrap = true;
this.style.breakWords = true;
if (this.styleTags.default !== undefined)
{
this.styleTags.default.wordWrapWidth = value;
this.styleTags.default.wordWrap = true;
this.styleTags.default.breakWords = true;
}
this.adjustForCentering();
}
get numTextLines()
{
var textMetrics = PIXI.TextMetrics.measureText(this.text.text, this.style);
return textMetrics.lines.length;
}
getText()
{
if (this.text.text == " ") return "";
return this.text.text;
}
setText(text, fontFamily, fontSize, align, spacing)
{
//if (Engine.Drawable.fastRenderMode) text = "";
if (fontFamily === undefined) fontFamily = "Verdana";
if (fontSize === undefined) fontSize = 12;
if (align === undefined) align = "left";
if (spacing === undefined) spacing = 1;
// early exit
if (text == this.text.text &&
fontFamily == this.style.fontFamily &&
fontSize == this.style.fontSize &&
align == this.style.align) return;
this.style.fontFamily = fontFamily;
this.style.fontSize = fontSize;
this.style.align = align;
this.text.text = text;
this.text.dirty = true;
this.adjustForCentering();
}
setTextInHeight(text, height, fontFamily, fontSize, align, spacing)
{
if (align === undefined) align = "left";
if (spacing === undefined) spacing = 1;
// early exit
if (text == this.text.text &&
fontFamily == this.style.fontFamily &&
fontSize == this.style.fontSize &&
align == this.style.align &&
height == this.style.scaleHeight) return;
this.style.align = align;
this.text.text = text;
this.text.dirty = true;
this.scaleTextToFit(null, height, fontFamily, fontSize);
}
setTextInWidth(text, width, fontFamily, fontSize, align, spacing)
{
if (align === undefined) align = "left";
if (spacing === undefined) spacing = 1;
// early exit
if (text == this.text.text &&
fontFamily == this.style.fontFamily &&
fontSize == this.style.fontSize &&
align == this.style.align &&
width == this.style.scaleWidth) return;
this.style.align = align;
this.text.text = text;
this.text.dirty = true;
this.scaleTextToFit(width, null, fontFamily, fontSize);
}
setTextInWidthHeight(text, width, height, fontFamily, fontSize, align, spacing)
{
if (align === undefined) align = "left";
if (spacing === undefined) spacing = 1;
// early exit
if (text == this.text.text &&
fontFamily == this.style.fontFamily &&
fontSize == this.style.fontSize &&
align == this.style.align &&
width == this.style.scaleWidth &&
height == this.style.scaleHeight) return;
this.style.align = align;
this.text.text = text;
this.text.dirty = true;
this.scaleTextToFit(width, height, fontFamily, fontSize);
}
setTextWithHighlightFormating(text, highlightColor, fontFamily, fontSize, align, spacing)
{
//if (Engine.Drawable.fastRenderMode) text = "";
if (fontFamily === undefined) fontFamily = "Verdana";
if (fontSize === undefined) fontSize = 12;
if (align === undefined) align = "left";
if (spacing === undefined) spacing = 1;
highlightColor = highlightColor.getHex();
if (this.styleTags.highlight == undefined) this.styleTags.highlight = {};
this.styleTags.highlight.fill = highlightColor;
text = text.replace(/{/g, "<highlight>");
text = text.replace(/}/g, "</highlight>");
// early exit
if (text == this.text.text &&
fontFamily == this.style.fontFamily == this.styleTags.default.fontFamily &&
fontSize == this.style.fontSize == this.styleTags.default.fontSize &&
align == this.style.align == this.styleTags.default.align &&
highlightColor == this.style.fill == this.styleTags.default.fill) return;
this.setMultiStyleText(text, fontFamily, fontSize, align);
}
setTextWithCustomColors(text, colors, fontFamily, fontSize, align, spacing)
{
//if (Engine.Drawable.fastRenderMode) text = "";
if (fontFamily === undefined) fontFamily = "Verdana";
if (fontSize === undefined) fontSize = 12;
if (align === undefined) align = "left";
if (spacing === undefined) spacing = 1;
if (!colors || typeof colors !== 'object') colors = {};
if (!colors['base']) colors['base'] = Colors.white;
for (let name in colors)
{
let hex = colors[name].getHex();
if (this.styleTags[name] == undefined) this.styleTags[name] = {};
this.styleTags[name].fill = hex;
}
text = '<base>' + text + '</base>';
// early exit
if (text == this.text.text &&
fontFamily == this.style.fontFamily == this.styleTags.default.fontFamily &&
fontSize == this.style.fontSize == this.styleTags.default.fontSize &&
align == this.style.align == this.styleTags.default.align) return;
this.setMultiStyleText(text, fontFamily, fontSize, align);
}
reSetText()
{
this.setText(this.getText(), this.getFont(), this.getFontSize(), this.getAlignment());
}
recenterText()
{
this.setText(this.getText(), this.getFont(), this.getFontSize(), "center");
}
scaleTextToFitHeight(height, fontFamily, fontSize)
{
// early exit
// if (fontFamily == this.style.fontFamily &&
// fontSize == this.style.fontSize &&
// height == this.style.scaleHeight) return;
this.scaleTextToFit(null, height, fontFamily, fontSize);
}
scaleTextToFit(width, height, fontFamily, fontSize)
{
this.style.scaleWidth = width;
this.style.scaleHeight = height;
this.style.fontFamily = fontFamily;
var fits = false;
while(!fits && fontSize > 4)
{
this.style.fontSize = fontSize;
var fitsWidth = (width == null || width > this.text.width);
var fitsHeight = (height == null || height > this.text.height);
fits = fitsWidth && fitsHeight;
fontSize--;
}
this.text.dirty = true;
this.adjustForCentering();
}
adjustForCentering()
{
if (this.style.align == "center")
{
if (this.style.wordWrap)
{
this.text.x = Math.floor((this.style.wordWrapWidth - this.text.width) * 0.5);
}
else
{
this.text.x = (this.textAreaWidth - this.text.width) * 0.5;
}
}
else if (this.style.align == "right")
{
if (this.style.wordWrap)
{
this.text.x = Math.floor(this.style.wordWrapWidth - this.text.width);
}
else
{
this.text.x = this.textAreaWidth - this.text.width;
}
}
else
{
this.text.x = 0;
}
}
setMultiStyleText(text, fontFamily, fontSize, align)
{
if (Engine.Drawable.fastRenderMode) text = "";
this.style.fontFamily = fontFamily;
this.style.fontSize = fontSize;
this.style.align = align;
this.styleTags.default.fontFamily = this.style.fontFamily;
this.styleTags.default.fontSize = this.style.fontSize;
this.styleTags.default.align = this.style.align;
this.styleTags.default.resolution = this.style.resolution;
this.styleTags.default.fill = this.style.fill;
this.styleTags.default.wordWrapWidth = this.style.wordWrapWidth;
this.styleTags.default.wordWrap = this.style.wordWrap;
this.styleTags.default.breakWords = this.style.breakWords;
if (this.multiText == null)
{
this.multiText = new MultiStyleText(text, this.styleTags);
}
this.removeChild(this.text);
this.isMultiStyleText = true;
this.addChild(this.text);
this.text.styles = this.styleTags;
this.text.style = this.style;
this.text.text = text;
this.text.dirty = true;
this.adjustForCentering();
}
removeFromParent()
{
if (this.parent != null) this.parent.removeChild(this);
}
get hasParent() { return this.parent != null; }
set fill(value)
{
this.style.fill = value;
}
setDropShadow(distance, color)
{
if (distance === undefined) distance = 1;
if (color === undefined) color = Colors.black;
this.style.dropShadow = true;
this.style.dropShadowDistance = distance;
this.style.dropShadowColor = color;
}
setOutline(thickness, color)
{
if (thickness === undefined) thickness = 1;
if (color === undefined) color = Colors.white;
this.style.strokeThickness = thickness;
this.style.stroke = color;
}
drawDebug()
{
if (this.graphics === undefined) this.graphics = new PIXI.Graphics();
this.addChildAt(this.graphics, 0);
this.graphics.clear();
this.graphics.beginFill(0xFFFFFF, 0.5);
var width = this.textAreaWidth > 0 ? this.textAreaWidth : this.text.width;
var height = this.text.height;
this.graphics.drawRect(0, 0, width, height);
}
}
Engine.FontStyle = class
{
constructor(fontFamily, fontSize, align)
{
if (align === undefined) align = "left";
this.family = fontFamily;
this.size = fontSize;
this.align = align;
}
}