Almightのタグでexp属性から他のタグを実行する方法
almightのbutton,link,choicesタグのexp属性で他のタグを実行する方法を紹介します。 exp属性にalmight.script.command();という形で、commandメソッドを使うことで他のタグを実行することができます。
commandメソッドとは
commandメソッドについての説明ですが、almight.jsに記載されていますので、まずそちらを引用します。
コマンドラインからタグを実行出来ます。
JS式でタグを実行したり、デバッグに利用出来ます。
複数のタグを指定しても、1つめのタグのみが実行されます。
@method command
@params {String} タグ
@params {Boolean} タグの結果に応じてシナリオを進行するかどうか
@return {Number} 0(停止) / 1(続行) / 2(非同期処理からの呼び出し) のステータス値を返します
引用元: almight.js
JavaScript式でタグを実行できる、というのが大事なポイントです。 exp属性にはJavaScript式を記述することで実行できるため、exp属性にcommandメソッドを使えば他のタグが使用できることが分かります。
補足となりますが、almightのタグについての説明箇所にもcommandメッソドのことが書かれているので、そちらも併せて引用します。
**Almightで使用出来るタグを管理します**
+ 0 : シナリオの処理を停止
+ 1 : シナリオの処理を続行
+ 2 : シナリオの処理を続行(非同期処理で処理が完了するとdequeueされる)
通常、直接呼び出すことはありません。
タグを実行する場合はScriptクラスのcommandメソッドを利用してください
@class Tag
引用元: almight.js
JavaScript式でalmight.script.tag.playbgm({storage: 'bgm.ogg'});という書き方をしてもタグを実行できるのですが、こういう書き方は推奨されていないようです。
exp属性から他のタグを使う
exp属性にjavaScript式でcommandメソッドを使えばよいことがわかったので、実際にどのような書き方になるかを紹介します。
// linkタグ BGM変更 [link exp="almight.script.command('[playbgm storage=bgm.ogg]')"]BGM[endlink] // buttnタグ 背景画像を変更 [button graphic="crown.png" exp="almight.script.command('[image storage=bg.png layer=base]')"] // choicesタグ 選択肢1でBGM再生 選択肢2で背景画像変更 [choices text1="bgm" exp1="almight.script.command('[playbgm storage=bgm.ogg]')" text2="背景変更" exp2="almight.script.command('[image storage=bg.png layer=base]')"]
exp="almight.script.command('[playse storage=se.ogg]')"という書き方をしていますが、シングルクォーテーション、ダブルクォーテーションの位置には注意してください。 exp="almight.script.command('[playse storage=se.ogg]')" 上記の赤文字の部分に注意するようにしてください。 exp属性と、commandメソッドには、文字列として値を渡してあげないといけないので、ダブルクォーテーションとシングルクォーテーションを併用する必要があります。 exp属性を""で囲ったJavaScript式を書いて、その中のcommand()の中も、''でタグの記述をまるっと囲みます。 [playse storage=bgm.ogg] 左記のように、storageの箇所をダブルクォーテーションで囲っていないのが気持ち悪いかもしれませんが、普通にタグを使うときも、実はタグの属性はダブルクォーテーションで囲う必要がないのです。 Almightは吉里吉里互換として作成されています。 吉里吉里は@playbgm storage=bgm loop=trueというように記述することができる仕様なので、Almightも同じように記述することができるようになっています。 そういうわけで[show_bg file=bg]という風に書いても動作するので、commandメッソドに指定する時にもstorageに対して""や''で囲ってあげなくても問題ありません。
動作しない例として、ダブルクォーテーションの中に + 演算子などで文字列の結合をせずに、そのままダブルクォーテーションを書くというものがあります。 exp="almight.script.command('[playbgm storage="bgm.ogg"]')" これは、どこからどこまでが文字列と解釈されるかというと、下記のように扱われます。 exp="almight.script.command('[playbgm storage="bgm.ogg"]')" このようにbgm.oggだけが文字列として扱われません。
ダブルクォーテーションの中にダブルクォーテーションをネストさせることはできませんし、シングルクォーテーションも同様です。 文字列を扱うときは、var str = "hogehoge" + "hugahuga";という風に+演算子で文字列を結合させたりします。 この結果、strに入るのはhogehogehugahugaという文字列になります。
どうしても、タグの中の属性はクォーテーションで囲いたいという場合は、以下のように記述してください。 [link exp="almight.script.command('[playbgm storage=' + 'bgm01.ogg'+ ']')"]BGM[endlink] このように記述すると正常に動作します。
「このような間違いをしがちかも?」という、正常に動作しない例を下記に書き出しておきます。
// exp属性へのcommandメソッドの指定が文字列として扱えていない [link exp=almight.script.command('[playbgm storage="bgm.ogg"]')]BGM[endlink] // commandメソッドへのタグの指定が文字列として扱えていない [link exp="almight.script.command([playbgm storage=bgm.ogg])"]BGM[endlink] // タグ全体ではなく、storageに対してのみ文字列の扱いをしている [link exp="almight.script.command([playbgm storage='bgm.ogg'])"]BGM[endlink] // ダブルクォーテーションの中にダブルクォーテーションを書いてしまっている [link exp="almight.script.command('[playbgm storage="bgm.ogg"]')"]BGM[endlink]