タグの作り方というより、タグが実行する「コマンド」の作り方の方が正しいです。タグが実行する実際の動きは TagAction オブジェクトで指定します。そのコマンドを作るってことは TagAction のオブジェクトを作ることです。それは action
と rules
が含まれてるオブジェクトです。
アクションを作る
すごい簡単な [hello]
タグを作ってみましょう。
// plugin/hello.js
Tag.actions.hello = new TagAction({
action: function(args) {
// ここの `args` は KAG 側の属性が入ってるオブジェクトです
console.log("Hello from JS! "+args.name);
return 0;
}
});
こういう風に実行できます:
[o2_loadplugin module="hello.js"]
[hello name="Foo"] ; こういう風に属性をJSに渡します
コンソールから Hello from JS! Foo が見えるはずです。
アクションは必ず数字を返さないといけないです、上のサンプルでは return 0;
をしましたが、それはタグはすぐ終わるという意味です、他の数字だと他の意味があります。
- 0 - タグはすぐ終わる
- 1 - タグはすぐ終わらない、終わった時システムに教えます。
- 2 - タグは永遠に終わらない、
[s]
タグとか。
return 1;
をしたら、システムに「このタグは終わりました」と伝える必要があります。方法は action
内で this.done()
を実行することです。
例えばこれは1秒を待ったせてから進むタグです。
Tag.actions.wait_1_second = new TagAction({
action: function(){
setTimeout(()=> this.done(), 1000);
return 1;
}
});
before
[wait_1_second]
after
"before" と "after" の間に一秒がかかるはずです。
属性を設定
TagAction に rules
を設定したら、属性は action
に渡す前にチェックと変換されます。rules
をしていするメリットは変換が便利だけではなく、チェックが通さなかった場合、自動的にエラーメッセージが表示されるから、デバッグしやすいです。
例えばこれは何秒間指定されたレイヤーを隠して、そして復元するタグです。
Tag.actions.hide_then_show = new TagAction({
rules: {
// "LAYER" タイプにすると、属性は Layer object が入ってるオブジェクトに変わります。
layer: {type:"LAYER", required:true},
// 正規表現も使えます。
page: {type:/fore|layer/, required:true},
// デフォルトの値も指定できます。
time: {type:"TIME", defaultValue: 1000 }
},
action: function(args) {
args.layer[args.page].visible = false;
setTimeout(()=> {
args.layer[args.page].visible = true;
this.done();
}, args.time);
return 1;
}
});
こういう風に使えます:
[hide_then_show layer=0 page=fore]
; 問題ない
[hide_then_show layer=99999 page=blah time=2000]
; エラー、`layer` が見つからない, `page` が合わない
[hide_then_show layer=base page=back time="1:00"]
; 問題ない、"TIME" タイプは属性を"1:00"から 60000 (ms) に変換できます
o2engineがサポートしてる type は以下通りですが、自分で追加することも可能です:
- STRING
- BOOLEAN - "true", "false" を true/false に変換
- INT
- FLOAT
- LAYER
- IMAGE_LAYER
- MESSAGE_LAYER
- COLOR - "0x112233" を "#112233" に変換
- TIME - "1:22:33" とか "1:22" を ms に変換
- OBJECT
- RUNNABLE (function あるいは eval される string)