
[ティラノスクリプト]簡易ループ(do ... while)の書き方
はじめに
「ティラノビルダー」使い易くて好きなんですが……
少し細かいことをやろうとすると、やはり辛くなってきます。
そこで、思い切って「ティラノスクリプト」に挑戦開始したのですが……
初めは、「うーん」この場合は、どうやるんだ?
と、悩みまくっていました。
が、あるとき急に閃きました!
あっ、もうこれってプログラムじゃん!!とw
プログラミング言語?
そう考えると「ティラノスクリプト」は色々備わっているんですよねー
プログラミング言語の基本は、フロー制御(jumpとかmacroとか)と変数(sfとかfとか)、そして判断(ifとcondとか)と、最後に繰り返し(loop)なんですが……なんと、ここがない!!
これがないと、プログラム的に書けないじゃん!! ってことで、何となく簡易的なループを考えてみました。
簡易ループ
まずはソース
つべこべ言わす、まずはソースですねw
ごちゃごちゃ書いてあるようですが、ほとんどはコメントです。
実質は6行ですが、ループ処理そのものだけであれば3行ですね!
; ループ用カウンタの初期化
@eval exp="tf.count_x=1"
; ループ開始
*do_while_x
; イメージ表示
; ※変数名に&を付けて、属性に代入する
; ※xにカウンタx50を指定して、表示座標を動的に変更
@image layer="0" storage="battle/mimic.png" x="&tf.count_x * 50" y="100" width="50" height="50"
; 回数表示
; ※変数名に&を付けて、属性に代入する
; ※JavaScriptのテンプレートリテラル(バッククォート)を利用して、変数を文字列に埋め込む
@ptext layer="0" x="&tf.count_x * 50" y="150" text="&`${tf.count_x}回目`"
; ループ終了
; ※condを利用して、カウンタの加算と条件判断を同時に行う
; ※cond属性の場合は、&を付けずに直接変数参照が可能
@jump target="*do_while_x" cond="++tf.count_x <= 5"
; ループ用カウンタの削除
@clearvar exp="tf.count_x"
ちなみに、このサンプルは、イメージを5回繰り返して表示します。
では、以下で詳しく説明していきますね。
①カウンタの初期化
; ループ用カウンタの初期化
@eval exp="tf.count_x=1"
ループ回数をカウントする変数を作ります。
一時変数(tf)に「count_x」と言う名前の変数を作成して、そこに初期値として、1を代入しています。
②ループ開始
; ループ開始
*do_while_x
ここは、ただのラベルです。
後ほど説明する、jumpで戻って来る場所になります。
※ちなみにですが、今回のループの方法が、C言語でいう「do ... while 文」に近い感じなので、ラベルを、このようにしました。
③イメージ表示
; イメージ表示
; ※変数名に&を付けて、属性に代入する
; ※xにカウンタx50を指定して、表示座標を動的に変更
@image layer="0" storage="battle/mimic.png" x="&tf.count_x * 50" y="100" width="50" height="50"
ここは、ループ内の処理なので、正直なんでも良いのですが
今回は、イメージ(ミミックの画像w)を表示しています。
結果を直ぐに確認できるので、イメージ表示は便利ですね!
で、ここで重要になってくるのは、&tf.count_xの部分です。
ループでカウントする変数を利用しています。
属性に変数の中身を利用する場合は、&(アンパサンド)を頭に付けてあげます。
ループの1回目ですと、&tf.count_xには、1が入っているので
1 x 50 で、表示位置xの値が50になります。
同様に、ループの2回目ですと、&tf.count_xには、2が入っているので、2 x 50 で、表示位置xの値が100になりますね!
④回数表示
; 回数表示
; ※変数名に&を付けて、属性に代入する
; ※JavaScriptのテンプレートリテラル(バッククォート)を利用して、変数を文字列に埋め込む
@ptext layer="0" x="&tf.count_x * 50" y="150" text="&`${tf.count_x}回目`"
ここも上記のイメージとほぼ同じです。
何回目のループかを「ptext」を使用して表示しています。
ちょっとしたテクニックとしては、text="&`${tf.count_x}回目`"の部分です。
&(アンパサンド)を頭に付けるのは、先ほどと同様に、変数の中身を取り出したいからです。
そして、次からの、バッククォート(‘~‘)で囲まれた部分は、JavaScriptのテンプレートリテラルと呼ばれるものです。
何かというと、このバッククォートで囲まれた文字列の中に、${変数名}の形を埋め込むと、ここを変数の値で置き換えてくれるというものです。
例えば、&tf.count_xに2が入っている場合
`${tf.count_x}回目`は、2回目となります。
⑤ループ終了
; ※condを利用して、カウンタの加算と条件判断を同時に行う
; ※cond属性の場合は、&を付けずに直接変数参照が可能
@jump target="*do_while_x" cond="++tf.count_x <= 5"
基本的には、ただのjumpです。なので、ループ開始の際に定義した*do_while_xへジャンプします。
ただし、このジャンプには、条件を付けてあります。
それが、cond="++tf.count_x <= 5"の部分です。
まず、condですが、これは、この条件が真(True)の場合、このタグを実行するというものです。
なので、条件が"++tf.count_x <= 5"の場合は、++tf.count_xが5以下であれば、ジャンプを実行する、ということになります。
ちなみに、++tf.count_xは、tf.count_xに1を足すという命令です。
※1つ注意点としては、condの中は、&(アンパサンド)を付けてはいけないという事です。
まとめると、「tf.count_xに1を加算した後の値が5以下なら、ループ開始位置へジャンプ」となります。
⑥ループ用カウンタの削除
@clearvar exp="tf.count_x"
ここでは、カウンタに使用していた変数を削除しています。
一時変数(tf)は、セーブデータ等に保存されることはないので、このまま放置しても構わないのですが、自分で使ったものは、自分で片付けましょう!の精神ですw
いや、これ、実は笑い事ではありません。
色々変数を使っていると、同じ名前の変数を使用してしまうことがあります。
その際、初期化を忘れたりしていると、最後に使用した値が残っていたりします。
今回の場合ですと、tf.count_xには、最終的に6が入っています。
なので、どこか別の場所で、tf.count_xを使うと、意図せず6が出てきてしまいます。余計なバグを出さないためにも、しっかりお片付け!というのは重要なことなのです。
さて結果!!
の前に、vscodeの実際のコードを貼っておきます。
なぜかと言うと、インデント!!
ループ開始のラベルと、終了のjumpタグの頭をそろえて、中身をインデントしておくと、見易いですよーってことです。
しかも、vscodeですと、線を引っ張ってくれるので、ホントに見やすいです!!

ホントに結果ですw
では、長い説明になってしまいましたが、上記の実行結果です。
ミミックバンザーイが5匹表示されてますねw

おわりに
自分自身の備忘録用というのもありますが、同じようにティラノスクリプトを使用し始めた人に、少しでも参考になれば幸いです。