前回の続きです。
kag.addTagを使うとコンダクタに次のタグを登録できます。登録するだけなので[s]タグなどでコンダクタが止まっている間はタグは実行されません。
タグが実行されない例
以下の例では[msgoff][msgon]タグを登録していますが、コンダクタが停止しているため実行されることはありません。
function flashMessage() { /* 以下のタグを登録 * @msgoff time=500 * @msgon time=500 */ kag.addTag("msgoff", %[ time:500 ]); kag.addTag("msgon", %[ time:500 ]); }
@linemode mode=vn コンダクタを停止します。 @click exp="flashMessage()" @s
[click]タグを使って左クリックされた時にflashMessage()が呼ばれるように設定しています。flashMessage()は[msgoff][msgon]タグを登録する関数です。[msgoff][msgon]を連続的に実行してメッセージレイヤを点滅させようとしていますが、これでは動作しません。
[s]タグでコンダクタの動作が停止されており、登録されたタグが実行されないためです。動作させるにはflashMessage()でタグを登録するだけでなくコンダクタの動作を開始しなければなりません。
実行されるように修正した例
以下が実際に動作するように修正したスクリプトです。クリックするたびにメッセージレイヤが点滅します。
function flashMessage() { /* 以下のタグを登録 * @msgoff time=500 * @msgon time=500 * @waittrig name=flash_message */ kag.addTag("msgoff", %[ time:500 ]); kag.addTag("msgon", %[ time:500 ]); kag.addTag("waittrig", %[ name:"flash_message" ]); // triggerでコンダクタの実行を再開 kag.trigger("flash_message"); }
@linemode mode=vn コンダクタを停止します。 @click exp="flashMessage()" @waittrig name=flash_message
[s]タグの代わりに[waittrig]タグを使っています。このタグもコンダクタの動作を停止しますが、name属性に指定したトリガが発動されるとコンダクタの動作を再開します。この場合は”flash_message”が発動すれば動作を再開します。
flashMessage()ではタグを登録してからkag.trigger(“flash_message”);としてトリガを発動します。これによってコンダクタの動作が再開され、登録したタグを順番に実行できます。
最初の例と異なり、[msgoff][msgon]タグだけでなく[waittrig]タグも登録していることに注意してください。[s]や[waittrig]などのタグでコンダクタを停止しない場合は当然そのまま実行し続けます。この例では登録したタグを実行し終わった後、first.ks最後の @waittrig name=flash_message の次の行から実行されます。続きを実行したくない場合はしっかり止めるようにしてください。
まとめ
kag.addTagを使うときはコンダクタの動作を意識するようにしてください。注意して使わないと思わぬバグの元になりかねません。
ピンバック: KAGEX拡張例(kag.addTagの仕組み) - Biscrat Blog
ピンバック: KAGEX拡張例(kag.insertTag) - Biscrat Blog