Tag player
Introduction¶
Text commands to control sprites, texts, sound effect or backgroun music.
- Author: Rex
- Member of scene
Live demos¶
Usage¶
Install plugin¶
Load minify file¶
- Load plugin (minify file) in preload stage
scene.load.plugin('rextagplayerplugin', 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/dist/rextagplayerplugin.min.js', true); - Add tag-player object
var tagPlayer = scene.plugins.get('rextagplayerplugin').add(scene, config);
Import plugin¶
- Install rex plugins from npm
npm i phaser3-rex-plugins - Install plugin in configuration of game
import TagPlayerPlugin from 'phaser3-rex-plugins/plugins/tagplayer-plugin.js'; var config = { // ... plugins: { global: [{ key: 'rexTagPlayerPlugin', plugin: TagPlayerPlugin, start: true }, // ... ] } // ... }; var game = new Phaser.Game(config); - Add tag-player object
var tagPlayer = scene.plugins.get('rexTagPlayerPlugin').add(scene, config);
Import class¶
- Install rex plugins from npm
npm i phaser3-rex-plugins - Import class
import TagPlayer from 'phaser3-rex-plugins/plugins/tagplayer.js'; - Add tag-player object
var tagPlayer = new TagPlayer(scene, config);
Create instance¶
var tagPlayer = scene.plugins.get('rexTagPlayerPlugin').add(scene, {
parser: {
delimiters: '[]',
comment: '//',
// translateTagNameCallback: undefined,
}
sprites: {
// createGameObject: 'sprite',
// fade: 500,
// fade: {mode: 'tint', time: 500},
// viewportCoordinate: false,
// symbols: undefined, // { key:value }
},
// sprites: false,
texts: {
// createGameObject: undefined,
// fade: 500,
// fade: {mode: 'tint', time: 500},
// viewportCoordinate: false,
// symbols: undefined, // { key:value }
}
// texts: false,
layers: undefined, // []
sounds: {
bgm: {
initial: undefinied,
loop: true,
fade: 500
},
bgm2: {
initial: undefinied,
loop: true,
fade: 500
}
},
clickTarget: scene,
});
parser: Configuration of parser.parser.delimiters: Delimiters of tag.- A single string with 2 characters. Default value is
'[]'. - A array with 2 strings. e.x.
['[[',']]'].
- A single string with 2 characters. Default value is
parser.comment: Start word of a comment line. Default value is'//'.null, orfalse: No comment line.
parser.translateTagNameCallback: Callback to translate tag-nameundefined: Use original tag-name. Default behavior.- A function, return new tag name.
function(tagName) { return newTagName; }
sprites: Configuration of sprites.sprites.createGameObject:'sprite': Create sprite game object. Default behavior.'image': Create image game object.- Callback to return a game object
function(scene, a, b, c) { // return gameObject; }a,b,c: Parameters pass from[sprite.name=a,b,c]
sprites.fade:0: No fade-in or fade-out when adding or removing a sprite.- A number : Duration of fading. Default value is
500. - A plain object contains
mode,timesprite.fade.mode: Fade modesprite.fade.time: Duration of fading. Default value is500.
sprites.viewportCoordinate: Apply viewportCoordinate behavior to sprite game object.true: Attachvpx,vpy,vpto sprite game object.vpx,vpy: Number between0~1. Proportion of viewport.vp: Viewport in rectangle
false: Do nothing, default behavior.
sprites.symbols: Convert string value to number value when Set or Ease property of game object.- A plain object contains string key and number value.
false,null: No sprite manager
texts: Configuration of texts.texts.createGameObject:undefined, or'text': Create text game object. Default behavior.- Callback to return a game object
function(scene, a, b, c) { // return gameObject; }a,b,c: Parameters pass from[text.name=a,b,c]
texts.fade:0: No fade-in or fade-out when adding or removing a text game object.- A number : Duration of fading. Default value is
500. - A plain object contains
mode,timetexts.fade.mode: Fade modetexts.fade.time: Duration of fading. Default value is500.
texts.viewportCoordinate: Apply viewportCoordinate behavior to text game object.true: Attachvpx,vpy,vpto sprite game object.vpx,vpy: Number between0~1. Proportion of viewport.vp: Viewport in rectangle
false: Do nothing, default behavior.
texts.symbols: Convert string value to number value when Set or Ease property of game object.- A plain object contains string key and number value.
false,null: No text manager
layers:undefined: Don't create layerManger.- Array of string : Pre-create layer game objects in layerManger.
sounds: Configuration of sound effect, or background music.sounds.bgm.initial,sounds.bgm2.initial: Initial music instance created byscene.sound.add(key)before starting playing content.undefined: No initial music instance, default value.
sounds.bgm.loop,sounds.bgm2.loop:true: Loop background music, default behavior.false: Play background music once.
sounds.bgm.fade,sounds.bgm2.fade:0: No fade-in or fade-out when starting or stopping a background music.- A number : Fade-in or fade-out (cross-fade) when starting or stopping a background music. Default value is
500.
clickTarget: Click target.scene: Any pointer down on this scene. Default target.
Custom class¶
- Define class
class MyTagPlayer extends TagPlayer { constructor(scene, config) { super(scene, config); // ... } // ... } - Create instance
var tagPlayer = new MyTagPlayer(scene, config);
Game object manager¶
tagPlayer.addGameObjectManager({
name: goType,
createGameObject: function(scene, ...) {
return gameObject
},
// fade: 500,
// fade: {mode: 'tint', time: 500},
// viewportCoordinate: false,
// viewportCoordinate: { viewport: new Phaser.Geom.Rectangle() },
// defaultLayer: layerName,
// symbols: undefined, // { key:value },
})
name: Name of this game object manager, a string.createGameObject: Callback to return a game object
function(scene, a, b, c) { // return gameObject; }a,b,c: Parameters pass from[goType.name=a,b,c]
fade: Tint-fade (if game object hastintproperty) or alpha-fade game object when creating or destroying a game object.0: No fade-in or fade-out when adding or removing a game object.- A number : Duration of fading. Default value is
500. - A plain object contains
mode,timefade.mode: Fade modefade.time: Duration of fading. Default value is500.
viewportCoordinate: Apply viewportCoordinate behavior to sprite game object.false: Do nothing, default behavior.true, or an object :viewport:undefined: Rectangle of display area under main camera of current scene. Default value.- A rectangle
defaultLayer: Put this game object into layer inside of layerManager.symbols: Convert string value to number value when Set or Ease property of game object.- A plain object contains string key and number value.
Built-in commands¶
goType : name parameter in config of tagPlayer.addGameObjectManager method
- Add game object :
[goType.name=a,b,c]- Tint-fade-in, or alpha-fade-in if
fadeis not0
- Tint-fade-in, or alpha-fade-in if
- Remove game object :
[/goType.name]- Tint-fade-out, or alpha-fade-out if
fadeis not0
- Tint-fade-out, or alpha-fade-out if
- Remove all game objects :
[/goType]- Tint-fade-out, or alpha-fade-out if
fadeis not0
- Tint-fade-out, or alpha-fade-out if
- Call method :
[goType.name.methodName=value0,value1,value2] - Set property :
[goType.name.x=value],[goType.name.alpha=value], .... - Ease property :
[goType.name.prop.easeMode=value,duration] [goType.name.prop.easeMode=value,duration,repeat] [goType.name.prop.easeMode=value,duration,easeFunction,repeat] [goType.name.prop.easeMode=value]prop: Any number property of this sprite.easeMode: One of these modesto,toLeft,toRight,toUp,toDownyoyo,yoyoLeft,yoyoRight,yoyoUp,yoyoDownfrom,fromLeft,fromRight,fromUp,fromDown
duration: Default value is1000easeFunction: Default value is'Linear'repeat: Default value is0
- Wait ease task of game object's number property :
[wait=goType.name.prop]- Also fire event
'wait.' + goTypetagPlayer.on('wait.' + goType, function(name, prop) { })
- Also fire event
- Wait a game objects are destroyed :
[wait=goType.name]- Also fire event
'wait.' + goTypetagPlayer.on('wait.' + goType, function(name, prop) { // prop parameter are `undefined` here })
- Also fire event
- Wait all game objects are destroyed :
[wait=goType]- Also fire event
'wait.' + goTypetagPlayer.on('wait.' + goType, function(name, prop) { // name and prop parameter are `undefined` here })
- Also fire event
- Wait boolean data in game object's data manager set to
true/false:[wait=goType.name.dataKey]/[wait=goType.name.!dataKey]- Also fire event
'wait.' + goTypetagPlayer.on('wait.' + goType, function(name, prop) { })
- Also fire event
Execute commands¶
tagPlayer.play(commands);
or
tagPlayer.playPromise(commands)
.then(function(){
// Typing content complete
})
Pause¶
- Pause
tagPlayer.pause(); - Pause until event
tagPlayer.pauseUntilEvent(eventEmitter, eventName); - Is paused (not playing)
var isPaused = !tagPlayer.isPlaying;
Invoke this method during tag-start,tag-end, or content events to suspend parsing.
Resume¶
tagPlayer.resume();
Time scale¶
Time scale of typing, typing animation, sprite animation and easing of sprite's properties.
- Get
var timeScale = tagPlayer.timeScale; - Set
tagPlayer.setTimeScale(timeScale);tagPlayer.timeScale = timeScale;
Events¶
- On typing content complete
tagPlayer.on('complete', function() { })
Tags of content¶
Sprite¶
- Add sprite :
[sprite.name=textureKey,frameKey]- Tint-fade-in if
sprite.fadeis not0
- Tint-fade-in if
- Remove sprite :
[/sprite.name]- Tint-fade-out if
sprite.fadeis not0
- Tint-fade-out if
- Remove all sprites :
[/sprite]- Tint-fade-out if
sprite.fadeis not0
- Tint-fade-out if
- Call method :
[sprite.name.methodName=value0,value1,value2] - Set property :
[sprite.name.x=value],[sprite.name.alpha=value], .... - Ease property :
[sprite.name.prop.easeMode=value,duration] [sprite.name.prop.easeMode=value,duration,repeat] [sprite.name.prop.easeMode=value,duration,easeFunction,repeat] [sprite.name.prop.easeMode=value]prop: Any number property of this sprite.easeMode: One of these modesto,toLeft,toRight,toUp,toDownyoyo,yoyoLeft,yoyoRight,yoyoUp,yoyoDownfrom,fromLeft,fromRight,fromUp,fromDown
duration: Default value is1000easeFunction: Default value is'Linear'repeat: Default value is0
- Set texture :
[sprite.name.texture=textureKey,frameKey] - Play animation :
[sprite.name.play=animationKey], or[sprite.name.play=animationKey0,animationKey1,...]- Can play animation without adding sprite first.
- Stop animation :
[/sprite.name.play], or[sprite.name.stop] - Pause animation :
[sprite.name.pause]
Text¶
- Add text :
[text.name]- Tint-fade-in if
text.fadeis not0
- Tint-fade-in if
- Remove text :
[/text.name]- Tint-fade-out if
text.fadeis not0
- Tint-fade-out if
- Remove all texts :
[/text]- Tint-fade-out if
text.fadeis not0
- Tint-fade-out if
- Call method :
[text.name.methodName=value0,value1,value2] - Set property :
[text.name.x=value],[text.name.alpha=value], .... - Ease property :
[sprite.name.prop.easeMode=value,duration] [sprite.name.prop.easeMode=value,duration,repeat] [sprite.name.prop.easeMode=value,duration,easeFunction,repeat] [sprite.name.prop.easeMode=value]prop: Any number property of this sprite.easeMode: One of these modesto,toLeft,toRight,toUp,toDownyoyo,yoyoLeft,yoyoRight,yoyoUp,yoyoDownfrom,fromLeft,fromRight,fromUp,fromDown
duration: Default value is1000easeFunction: Default value is'Linear'repeat: Default value is0
- Set text
[text.name.text] content\\n newline\\n newline - Typing text
[text.name.typing] // [text.name.typing=speed] content\\n newline\\n newline
Sound effect¶
- Play :
[se=key],[se2=key]- Sound effect will be destroyed when complete
- Play with fade in volume :
[se=key,1000],[se2=key,1000] - Fade in volume :
[se.fadein=1000],[se2.fadein=1000] - Fade out volume :
[se.fadeout=1000],[se2.fadeout=1000] - Fade out volume then stop :
[se.fadeout=1000,stop],[se2.fadeout=1000,stop] - Set volume :
[se.volume=1],[se2.volume=1]
Background music¶
- Play, stop :
[bgm=key],[/bgm],[bgm2=key],[/bgm2]- Previous background music will be stopped and destroyed.
- Cross fade to next background music if
sounds.bgm.fade/sounds.bgm2.fadeis not0
- Play with fade in volume :
[bgm=key,1000],[bgm2=key,1000] - Pause, resume :
[bgm.pause],[/bgm.pause],[bgm2.pause],[/bgm2.pause] - Fade in volume :
[bgm.fadein=1000],[bgm2.fadein=1000] - Fade out volume :
[bgm.fadeout=1000],[bgm2.fadeout=1000] - Fade out volume then stop :
[bgm.fadeout=1000,stop],[bgm2.fadeout=1000,stop] - Cross fade to another background music :
[bgm.cross=key,10000],[bgm2.cross=key,10000] - Set volume :
[bgm.volume=1],[bgm2.volume=1] - Mute :
[bgm.mute],[bgm2.mute],[bgm.unmute],[bgm2.unmute]
Camera¶
- Fade-in effect :
[camera.fadein],[camera.fadein=1000], or[camera.fadein=duration,red,green,blue] - Fade-out effect :
[camera.fadeout],[camera.fadeout=1000], or[camera.fadeout=duration,red,green,blue] - Flash effect :
[camera.flash],[camera.flash=1000], or[camera.flash=duration,red,green,blue] - Shake effect :
[camera.shake],[camera.shake=1000], or[camera.shake=duration,intensity] - Zoom
- Set zoom :
[camera.zoom=2] - Zoom to :
[camera.zoom.to=1,1000], or[camera.zoom.to=zoomValue,duration,Cubic]
- Set zoom :
- Rotate
- Set angle :
[camera.rotate=90], angle in degrees - Rotate to :
[camera.rotate.to=0,1000], or[camera.rotate.to=deg,duration,Cubic], angle in degrees
- Set angle :
- Scroll
- Scroll x,y :
[camera.scroll=0,200] - Scroll x,y to :
[camera.scroll.to=0,200,1000], or[camera.rotate.to=x,y,duration,Cubic]
- Scroll x,y :
Wait conditions¶
- Wait click :
[wait=click],[click]- Also fire event
'wait.click'tagPlayer.on('wait.click', function() { })
- Also fire event
- Wait key-down :
[wait=enter],[wait=space], ....- Also fire event
'wait.keydown'tagPlayer.on('wait.keydown', function(keyName) { })
- Also fire event
- Wait time :
[wait=1000]- Also fire event
'wait.time'tagPlayer.on('wait.time', function(time) { })
- Also fire event
- Wait sound effect :
[wait=se],[wait=se2]- Also fire event
'wait.music'tagPlayer.on('wait.music', function(music) { // var key = music.key; })
- Also fire event
- Wait background music :
[wait=bgm],[wait=bgm2]- Also fire event
'wait.music'tagPlayer.on('wait.music', function(music) { // var key = music.key; })
- Also fire event
- Wait camera effect :
[wait=camera.fadein],[wait=camera.fadeout],[wait=camera.flash],[wait=camera.shake],[wait=camera.zoom],[wait=camera.rotate],[wait=camera.scroll]- Also fire event
'wait.camera'tagPlayer.on('wait.camera', function(effectName) { // effectName : 'camera.fadein', 'camera.fadeout', 'camera.flash', 'camera.shake', 'camera.zoom', 'camera.rotate', 'camera.scroll' })
- Also fire event
- Wait ease task of sprite's property :
[wait=sprite.name.prop]- Also fire event
'wait.sprite'tagPlayer.on('wait.sprite', function(name, prop) { })
- Also fire event
- Wait a sprite are destroyed :
[wait=sprite.name]- Also fire event
'wait.sprite'tagPlayer.on('wait.sprite', function(name, prop) { // prop parameter are `undefined` here })
- Also fire event
- Wait all sprites are destroyed :
[wait=sprite]- Also fire event
'wait.sprite'tagPlayer.on('wait.sprite', function(name, prop) { // name and prop parameter are `undefined` here })
- Also fire event
- Wait boolean data in sprite's data manager set to
true/false:[wait=sprite.name.dataKey]/[wait=sprite.name.!dataKey]- Also fire event
'wait.sprite'tagPlayer.on('wait.sprite', function(name, prop) { })
- Also fire event
- Wait callback :
[wait], or[wait=xxx](xxxis any string which not been used in above case)- Fire event
'wait'tagPlayer.on('wait', function(callback) { // Invoke `callback()` to continue typing }) - Fire event
'wait.xxx'tagPlayer.on('wait.xxx', function(callback) { // Invoke `callback()` to continue typing })
- Fire event
- Combine conditions :
[wait=cond0|cond1|...]- Wait click, or enter key down :
[wait=click|enter] - Wait click, enter key down, or 100ms :
[wait=click|enter|1000]
- Wait click, or enter key down :
Custom tag¶
Assume that adding a custom tag : [custom=10,20][/custom]
- On parse/execute a
+customtag, will add a custom command childtagPlayer.on('+custom', function(parser, a, b) { // console.log('Parse +custom tag:', a, b) })a,b, ... : Parameters after=- Set content callback, will invoke this callback when getting a content
var callback = function(content) { // ... } tagPlayer.setContentCallback(callback, scope);
- On parse/execute a
-customtag, will add a custom command childtagPlayer.on('-custom', function(parser) { // console.log('Parse -custom tag') })- Clear content callback
tagPlayer.setContentCallback();
- Clear content callback
Content¶
These lines will be skipped :
- Empty line, which only has space characters.
- Comment line, start with
'//'.
New line symbol '\n' will be removed, use \\n to insert a new line character.
Content will pass to one of these callback/event
- Set content callback
tagPlayer.setContentCallback(callback, scope);- Clear content callback
tagPlayer.setContentCallback();
- Clear content callback
- On parse/execute a content, after a
[custom]tag.tagPlayer.on('custom#content', function(content) { }) - On parse/execute a content, after any tag.
tagPlayer.on('content', function(content) { })
Game objects¶
- Get game object by name
var gameObject = tagPlayer.getGameObject(goType, name); - Get all game objects of a game object manager
var gameObjects = tagPlayer.getGameObject(goType);gameObjects:{name: gameObject}
- Add existed game object into game object manager
tagPlayer.addGameObject(goType, name, gameObject);
Data¶
- Get
var value = tagPlayer.getData(key); var values = tagPlayer.getData(keys); // keys: an array of keys var value = tagPlayer.data.values[key]; - Set
or
tagPlayer.setData(key, value); tagPlayer.incData(key, value); tagPlayer.setData(obj); // obj: {key0:value0, key1:value1, ...} tagPlayer.data.values[key] = value; tagPlayer.data.values[key] += inc;tagPlayer.toggleData(key); - Enable
tagPlayer.setDataEnabled(); - Events :
- Set data evant
tagPlayer.on('setdata', function(tagPlayer, key, value){ /* ... */ }); - Change data event
tagPlayer.on('changedata', function(tagPlayer, key, value, previousValue){ /* ... */ });tagPlayer.on('changedata-' + key, function(tagPlayer, value, previousValue){ /* ... */ });
- Set data evant
See data manager
Note
Ensure data manager is created before binding any data-changed events.