BBCode Text
Introduction¶
Drawing text with BBCode protocol.
- Author: Rex
- Game object
Live demos¶
- BBCode text
- Hit area
- Align
- Escape
- Page, typing
- Wrap
- Font family
- Measure margin of text
- Generate texture
- Image height
- RTL
Usage¶
Install plugin¶
Load minify file¶
- Load plugin (minify file) in preload stage
scene.load.plugin('rexbbcodetextplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rexbbcodetextplugin.min.js', true); - Add text object
var txt = scene.add.rexBBCodeText(x, y, content, config);
Import plugin¶
- Install rex plugins from npm
npm i phaser3-rex-plugins - Install plugin in configuration of game
import BBCodeTextPlugin from 'phaser3-rex-plugins/plugins/bbcodetext-plugin.js'; var config = { // ... plugins: { global: [{ key: 'rexBBCodeTextPlugin', plugin: BBCodeTextPlugin, start: true }, // ... ] } // ... }; var game = new Phaser.Game(config); - Add text object
var txt = scene.add.rexBBCodeText(x, y, content, config);
Import class¶
- Install rex plugins from npm
npm i phaser3-rex-plugins - Import class
import BBCodeText from 'phaser3-rex-plugins/plugins/bbcodetext.js'; - Add text object
var txt = new BBCodeText(scene, x, y, content, config); scene.add.existing(txt);
BBCode¶
- Bold :
[b]text[/b] - Weight :
[weight=900]text[/weight]- Valid when text does not have bold tag.
- Italic :
[i]text[/i] - Color :
[color=red]text[/color][color=#FF0000]text[/color][color=rgb(255,0,0)]text[/color][color=rgba(255,0,0,1)]text[/color]
- Size :
[size=18]text[/size] - Family :
[family=papyrus]text[/family] - Stroke :
[stroke]text[/stroke]- Stroke with color setting :
[stroke=red]text[/stroke]
- Stroke with color setting :
- Shadow :
[shadow]text[/shadow]- Shadow with color setting :
[shadow=red]text[/shadow]
- Shadow with color setting :
- Underline :
[u]text[/u]- Underline with color setting :
[u=red]text[/u]
- Underline with color setting :
- Strikethrough :
[s]text[/s]- Strikethrough with color setting :
[s=red]text[/s]
- Strikethrough with color setting :
- Background color :
[bgcolor=red]text[/bgcolor][bgcolor=#FF0000]text[/bgcolor][bgcolor=rgb(255,0,0)]text[/bgcolor][bgcolor=rgba(255,0,0,1)]text[/bgcolor]
- Superscript, subscript :
[y=-12]text[y] - Image :
[img=imgKey] - Hit area of words :
[area=key]text[/area] - Url link :
[url=http...]text[/url]- Click this area to open web page on a new tab (
window.open(url, '_blank')) - Will register hit area with key
url:http...
- Click this area to open web page on a new tab (
- Line alignment :
[align=left]text[/align],[align=center]text[/align],[align=right]text[/align]
- Escape : Tags between
[esc]...[/esc]or[raw]...[/raw]will be treated as content.[esc][color=yellow]Text[/color][/esc][esc][raw]Text[/raw][/esc][raw][esc]Text[/esc][/raw][raw][b]Text[/b][/raw]
- Do nothing, just a marker :
[id=0][color=red]Text[/id]TextText[/color]
Note
Can set delimiter [] to another custom value in style of constructor.
Add text object¶
var txt = scene.add.rexBBCodeText(x, y, '[b]h[/b]ello');
// var txt = scene.add.rexBBCodeText(x, y, '[b]h[/b]ello', { fontFamily: 'Arial', fontSize: 64, color: '#00ff00' });
Default style
{
fontFamily: 'Courier',
fontSize: '16px',
fontStyle: '',
backgroundColor: null, // null, css string, or number
backgroundColor2: null, // null, css string, or number
backgroundHorizontalGradient: true,
backgroundStrokeColor: null, // null, css string, or number
backgroundStrokeLineWidth: 2,
backgroundCornerRadius: 0,
// 0 : no round corner,
// > 0 : convex round corner
// < 0 : concave round corner
backgroundCornerIteration: null,
color: '#fff', // null, css string, or number
stroke: '#fff', // null, css string, or number
strokeThickness: 0,
shadow: {
offsetX: 0,
offsetY: 0,
color: '#000', // css string, or number
blur: 0,
stroke: false,
fill: false
},
underline: {
color: '#000', // css string, or number
thickness: 0,
offset: 0
},
strikethrough: {
color: '#000', // css string, or number
thickness: 0,
offset: 0
},
// align: 'left', // Equal to halign
halign: 'left', // 'left'|'center'|'right'
valign: 'top', // 'top'|'center'|'bottom'
padding: {
left: 0,
right: 0,
top: 0,
bottom: 0,
},
maxLines: 0,
lineSpacing: 0,
fixedWidth: 0,
fixedHeight: 0,
testString: '|MÉqgy',
wrap: {
mode: 'none', // 0|'none'|1|'word'|2|'char'|'character'|3|'mix'
width: null
},
// wordWrap: { width: 0 }, // Compatible with Text game object
// rtl: false,
metrics: false,
// metrics: {
// ascent: 0,
// descent: 0,
// fontSize: 0
// },
// images: {
// imgKey: {y: -8}
// },
// delimiters: '[]',
// sharedPool: true,
// urlTagCursorStyle: 'pointer',
// interactive: false
}
or
var txt = scene.add.rexBBCodeText({
x: 0,
y: 0,
text: '',
style: {
fontSize: '64px',
fontFamily: 'Arial',
color: '#ffffff',
align: 'center',
backgroundColor: '#ff00ff',
// ...
},
})
or
var txt = scene.make.rexBBCodeText({
x: 0,
y: 0,
padding: {
left: 0,
right: 0,
top: 0,
bottom: 0
//x: 32, // 32px padding on the left/right
//y: 16 // 16px padding on the top/bottom
},
text: 'Text\nGame Object\nCreated from config',
style: {
fontSize: '64px',
fontFamily: 'Arial',
color: '#ffffff',
align: 'center',
backgroundColor: '#ff00ff',
// ...
},
// origin: {x: 0.5, y: 0.5},
add: true
});
- Alignment
halign, oralign: Horizontal alignment.'left','center','right'
valign: Vertical alignment.'top','center','bottom'
images: See Imagedelimiters: Delimiters of tags, default value is[].- Don't use
()as delimiters, which is preserved for color value.
- Don't use
sharedPool:true: Use shared resouce pools during game. Default behavior.false: Use local resource pools, will be free when game object destroying.
urlTagCursorStyle: Cursor style when cursor moving over a url tag. Default value is'pointer'.interactive:true: Invoketxt.setInteractive()for hit-area tag, or url tag.false: Do nothing. Default behavior.
Custom class¶
- Define class
class MyText extends BBCodeText { constructor(scene, x, y, text, style) { super(scene, x, y, text, style); // ... scene.add.existing(this); } // ... // preUpdate(time, delta) {} }scene.add.existing(gameObject): Adds an existing Game Object to this Scene.- If the Game Object renders, it will be added to the Display List.
- If it has a
preUpdatemethod, it will be added to the Update List.
- Create instance
var txt = new MyText(scene, x, y, '[b]h[/b]ello');
Wrap¶
- Wrap by word or character.
var txt = scene.make.rexBBCodeText({ x: 400, y: 100, text: 'The sky above the port was the color of television, tuned to a dead channel.', origin: { x: 0.5, y: 0.5 }, style: { font: 'bold 25px Arial', fill: 'white', wrap: { mode: 'none', // 0|'none'|1|'word'|2|'char'|'character'|3|'mix' width: 0 } } });wrap.mode:0, or'none': No wrapping, default behavior.1, or'word': Word wrapping.2, or'char', or'character': Character wrapping.3, or'mix': Word wrapping for ASCII word, Character wrapping for other (unicode) word.
wrap.width: Maximun wrapping width of a line.- Wrap-fit : Set wrapping width to
fixedWidth - padding.left - padding.rightiffixedWidth > 0
- Wrap-fit : Set wrapping width to
- Wrap mode
- Get
var mode = txt.style.wrapMode; - Set
txt.setWrapMode(mode);0, or'none': No wrapping.1, or'word': Word wrapping.2, or'char', or'character': Character wrapping.3, or'mix': Word wrapping for ASCII word, Character wrapping for other (unicode) word.
- Get
- Wrap width
- Get
var width = txt.style.wrapWidth; - Set
txt.setWrapWidth(width); // txt.setWordWrapWidth(width);width: Maximun wrapping width of a line.- Wrap-fit : Set wrapping width to
fixedWidth - padding.left - padding.rightiffixedWidth > 0
- Wrap-fit : Set wrapping width to
- Get
Content¶
- Get source text
var curContent = txt.text; - Get plain text
var plainText = txt.getPlainText();var plainText = txt.getPlainText(content); - Get sub-string
var text = txt.getText(start, end); - Get wrapped lines
var linesArray = txt.getWrappedText();var linesArray = txt.getWrappedText(content); - Set
txt.setText('[b]h[/b]ello'); // txt.text = '[b]h[/b]ello'; - Append
or
txt.appendText(text); // txt.text += '\n' + text;txt.appendText(text, false); // txt.text += text;
Set style¶
txt.setStyle(style);
txt.setFont(font); // font: {fontFamily, fontSize, fontStyle}
txt.setFontFamily(family);
txt.setFontSize(size);
txt.setFontStyle(style);
Color¶
- Text color
- Get
var color = txt.style.color; - Set
or
txt.setColor(color);txt.setFill(color);color:null, css string, or number.
- Get
- Stroke color, thickness
- Get
var color = txt.style.stroke; var thickness = txt.style.strokeThickness; - Set
txt.setStroke(color, thickness);color:null, css string, or number.
- Clear
txt.setStroke();
- Get
- Underline color, thickness
- Get
var color = txt.style.underlineColor; var thickness = txt.style.underlineThickness; var offset = txt.style.underlineOffset; - Set
txt.setUnderline(color, thickness, ofset); txt.setUnderlineColor(color); txt.setUnderlineThinkness(thickness); txt.setUnderlineOffset(ofset);color:null, css string, or number.
- Get
- Strikethrough color, thickness
- Get
var color = txt.style.strikethroughColor; var thickness = txt.style.strikethroughThickness; var offset = txt.style.strikethroughOffset; - Set
txt.setStrikethrough(color, thickness, ofset); txt.setStrikethroughColor(color); txt.setStrikethroughThinkness(thickness); txt.setStrikethroughOffset(ofset);color:null, css string, or number.
- Get
- Background
- Color, or gradient color
- Get
var color = txt.style.backgroundColor; var color2 = txt.style.backgroundColor2; var isHorizontalGradient = txt.style.backgroundHorizontalGradient; - Set
txt.setBackgroundColor(color); // txt.setBackgroundColor(color, color2, isHorizontalGradient);color,color2:null, css string, or number.
- Get
- Stroke color
- Get
var color = txt.style.backgroundStrokeColor; var lineWidth = txt.style.backgroundStrokeLineWidth; - Set
txt.setBackgroundStrokeColor(color, lineWidth);color:null, css string, or number.
- Get
- Round rectangle
- Get
var radius = txt.style.backgroundCornerRadius; var iteration = txt.style.backgroundCornerIteration;radius:0: No round corner> 0: Convex round corner< 0: Concave round corner
- Set
txt.setBackgroundCornerRadius(radius); // txt.setBackgroundCornerRadius(radius, iteration);iteration:undefined: Round rectangle0: Octagon
- Get
- Color, or gradient color
- Shadow
- Get
var color = txt.style.shadowColor; var offsetX = txt.style.shadowOffsetX; var offsetY = txt.style.shadowOffsetY; var blur = txt.style.shadowBlur; var stroke = txt.style.shadowStroke; var enabled = txt.style.shadowFill; - Set
txt.setShadow(x, y, color, blur, shadowStroke, shadowFill); txt.setShadowOffset(x, y); txt.setShadowColor(color); txt.setShadowBlur(blur); txt.setShadowStroke(enabled); txt.setShadowFill(enabled);color:null, css string, or number.
- Get
Align¶
- Horizontal align
- Get
var align = txt.style.halign;align:'left','center','right'
- Set
or
txt.setHAlign(align);txt.setAlign(align);align:'left','center','right'
- Get
- Vertical align
- Get
var align = txt.style.valign;align:'top','center','bottom'
- Set
txt.setVAlign(align);align:'top','center','bottom'
- Get
Image¶
- Uses texture key as image key by default.
- Add image render information
txt.addImage(imgKey, { key: textureKey, frame: frameName, width: undefined, height: undefined, y: 0, left: 0, right: 0, originX: 0, originY: 0, tintFill: false, });imgKey: Image key used in text content, i.e.[img=imgKey].key: Texture key.frame: Frame name.width: Render width, setundefinedto use the cut width of frame.height: Render height, setundefinedto use the cut height of frame.y: Extra offset y.left: Left padding space.Right: Right padding space.originX: Offset x via frame width *originXoriginY: Offset y via frame height *originYtintFill:false: Keep original color. Default behavior.true: Change fill-color by color tag.[color=...][img=...].
- Add some image render informations
txt.addImage(data);data:{imgKey, config}
Hit area of words¶
Size of hit-area is word-width x line-height, or image-width x line-height.
Hitting events¶
- Pointer down
or
txt.on('areadown', function(key, pointer, localX, localY, event){ }, scope)txt.on('areadown-' + key, function(pointer, localX, localY, event){ }, scope) - Pointer click : pointer down then up, without pointer out
or
txt.on('areaclick', function(key, pointer, localX, localY, event){ }, scope)txt.on('areaclick-' + key, function(pointer, localX, localY, event){ }, scope) - Pointer up
or
txt.on('areaup', function(key, pointer, localX, localY, event){ }, scope)txt.on('areaup-' + key, function(pointer, localX, localY, event){ }, scope) - Pointer over
or
txt.on('areaover', function(key, pointer, localX, localY, event){ }, scope)txt.on('areaover-' + key, function(pointer, localX, localY, event){ }, scope) - Pointer out
or
txt.on('areaout', function(key, pointer, localX, localY, event){ }, scope)txt.on('areaout-' + key, function(pointer, localX, localY, event){ }, scope)
Draw hit-areas¶
txt.drawAreaBounds(graphics, color);
graphics: Graphics game objectcolor: Default value is0xffffff
Get hit area by world position¶
var key = txt.getHitArea(worldX, worldY);
// var key = txt.getHitArea(worldX, worldY, camera);
camera: Camera of world positionundefined: Use default camera (scene.cameras.main)
Line spacing¶
This value is added to the height of the font when calculating the overall line height.
- Get
var lineSpacing = txt.style.lineSpacing; - Set
txt.setLineSpacing(value);
Padding¶
- Get
var left = txt.padding.left; var top = txt.padding.top; var right = txt.padding.right; var bottom = txt.padding.bottom; - Set
txt.setPadding(left, top, right, bottom); // txt.setPadding(padding); // padding: {left, top, right, bottom}
Max lines¶
- Get
var maxLines = txt.style.maxLines; - Set
txt.setMaxLines(max);
Fixed size¶
- Get
var width = txt.style.fixedWidth; var height = txt.style.fixedHeight; - Set
txt.setFixedSize(width, height);
Margin of text¶
var leftMargin = txt.measureTextMargins(testString).left;
testString: Measure left margin of this text.
Shift start position of text¶
txt.setXOffset(value);
Resolution¶
- Get
var resolution = txt.style.resolution; - Set
txt.setResolution(resolution);
Test string¶
Set the test string to use when measuring the font.
txt.setTestString(text);
Save texture¶
txt.generateTexture(key);
// txt.generateTexture(key, x, y, width, height);
Delimiters¶
txt.setDelimiters(delimiters); // '<>', or ['<', '>']
or
txt.setDelimiters(delimiterLeft, delimiterRight); // '<', '>'
Warning
Don't use () as delimiters, which is preserved for color value.
RTL¶
- Set
rtlin style config when creating this text game object - Change
rtlduring runtimetxt.setRTL(rtl).setText(newContent);- Invoke
setRTLmethod before setting new content.
- Invoke
Other properties¶
See game object
Create mask¶
var mask = txt.createBitmapMask();
See mask
Shader effects¶
Support preFX and postFX effects