【ティラノスクリプト】同じような記述が続く場合、まとめて書きたい!【for文】
【ティラノスクリプト】for文プラグイン
(tyranoscript_v602cで確認)
ゲームを作ってて、同じような記述を繰り返すことって割とあるあるなんですが、とはいえ3つや5つくらいならコピペや一括変換などを使えば別に……、ってなっていました。
でも、10くらいになると「ん?」ってなるし、20になればいやこれは何かいい書き方あるんじゃないかってなりますよね。
そもそも、ゲーム作りってトライアンドエラーが多く、その10個に修正が入った時に10か所直すの? っていう面倒さもあります。
で、同じような命令を繰り返す書き方はいろいろあると思いますが、ティラノスクリプトにはプラグインで「for文」が使えるようになるので、試してみました!!
for文とは
やることは「繰り返し」なので、loopやwhileなどと同様なイメージで、一定の回数処理を繰り返す、命令だと思っています。
ただ「なんか難しそう」「よくわからない」「バグった時に直せるかな?」など敷居の高さもあって使わないで済むならいらないよねってずっと避けていました。
でもいざとなると便利で、かつ修正やバグ対処についてもfor文を使っていた方が楽になると思うので、自分なりに使い方をまとめておきます。
まずはプラグインを設定
https://plugin.tyrano.jp/item/2035 (for文プラグイン)
ティラノ公式のプラグインライブラリからDLしました
設定法などは、プラグインの説明を参照してください
[for]~[nextfor]タグ
プラグインのREADME.txtで丁寧に説明されていますが、素人には読んだところで分かるような分からないようなw そこでやーめたって気分になりがちなので、とりあえず必要な要素だけ、やりたいことができればヨシとします
同じような命令が繰り返せればOK
例えば、「100×100サイズの同じ画像を5枚横に並べて表示する」とします。
・X座標は画像の分の100ずつずらしていくので+100、+200で表示しています
for文を使わない場合、以下のように似たような命令で座標が違うだけの命令を羅列します。
[image name ="image1" storage ="image1.jpg" x ="&f.x" y="&f.y" layer="0" ] [image name ="image2" storage ="image1.jpg" x ="&f.x+100" y="&f.y" layer="0" ] [image name ="image3" storage ="image1.jpg" x ="&f.x+200" y="&f.y" layer="0" ] [image name ="image4" storage ="image1.jpg" x ="&f.x+300" y="&f.y" layer="0" ] [image name ="image5" storage ="image1.jpg" x ="&f.x+400" y="&f.y" layer="0" ]これで終われば別にいいかなって感じですが、例えば、制作中にやっぱりこの画像をボタンに変えようとか、画像のサイズを変えたいなど何か修正が発生すると×5倍の作業になるんですよね。
その際に、1つだけ忘れてた、1つだけ修正ミスしたと新たなバグが生れがち。
5個ならまだしも10個なら?? って考えるとまとめておきたい!
★ちなみに座標(x,y)は調整する可能性が大なのであらかじめ変数にしています。
★ここでは座標だけ変更していきます
上記をfor文でまとめます
[for name=f.i from=1 to=5] [image name ="image1" storage ="image1.jpg" x ="&f.x" y="&f.y" layer="0" ] ;x座標を加算していく [eval exp="f.x = f.x + 100"] [nextfor]まず、ファイルがすっきりしますよね! これだけでも凄い!
ただ見慣れないとパッと見て「画像を5枚並べてる記述」と認識できないかもしれません。
また同じようなfor文が沢山あるとどれがどれの? って見た目で区別しにくいかも?
なので丁寧にコメントつけるのは必須になります。
そして肝心の「命令」は1つだけなので、調整、変更、修正などが発生しても楽ちんなのは一目瞭然!!
[for name=f.i from=1 to=5]でやっていること
forはタグ名
name =f,i は繰り返す回数を保存する変数(何でもいい)
from = 1はカウントのスタート
to = 5 はカウントの終わり
この[for]と[nextfor]の間に繰り返したい記述を書くだけ。
★from = 0 to =4 でも5回になりますが、見た目で分かりやすく1~5にしています
[eval exp="f.x = f.x + 100"]
画像を配置するたびにx座標を+100することで横に並べています。
変数f.iを利用する
こうして[for]~[nextfor]には繰り返したい記述ができますが、変数f.iを利用することもできます。
例えば以下のように、カウント数を利用して5×2列に並べたり。
[for name=f.i from=1 to=10] [if exp ="f.i < 6"] [image name ="image1" storage ="image1.jpg" x ="&f.x" y="&f.y" layer="0" folder ="imag ;x座標を加算していく [eval exp="f.x = f.x + 100"] [else] ;x座標はマイナスしていく [eval exp="f.x = f.x - 100"] [image name ="image1" storage ="image1.jpg" x ="&f.x" y="&f.y + 100" layer="0" folder ="image"] [endif] [nextfor]
ポイント
基本はただ繰り返すだけなので、規則性を見つけてうまく利用するのがポイント
なので、記述もいろいろあると思いますが、デバッグなどを考えて自分が分かりやすいのでいいと思ってます。
上記の場合は、カウントが6になったら2段目の処理にしていますが、f.xの値が最後に加算されている状態なので、マイナス処理を先に書いて折り返して配置しています。
f.yは+100するだけ。
これも実際動かしてみると、どうしたらいいのかなど見えてくると思います。
また個人的にカウント用の変数名は固定にするのがいいと思いました。
固定にするのは好きなものでいいんですけど、拘りがなければ「f.i」のままにしておけば「f.i」が何をしているのかいちいち調べる必要がなくなります。
特に[for]の中で処理が増えていろんな変数が出てくると、後から見た時にスムーズだと思います。
実用例
ここまでで、forタグでできることがなんとなくわかったと思います。
わかったところで、実際にゲームで使いそうな例をメモしておきます。
ボタンを並べる
メニュー画面などでボタンを規則的に並べたい時の一例
★4つの同じサイズの画像「image1~4」を縦(縦150pxごと)に配置
★それぞれに*evt1~4のイベントをつけて、クリックした時に横のメッセージウインドウに文字を表示しています
[for name=f.i from=1 to=4] [iscript] ;ボタン名 f.name ='image' + f.i ;画像ファイル名 f.image ='image' + f.i + '.jpg' ;イベント名 f.evt ='*evt' + f.i [endscript] [button graphic="&f.image" x="&f.x" y="&f.y" storage ="" target ="&f.evt" fix="true"] [eval exp="f.y = f.y + 150"] [nextfor] [s] *evt1 [er] イベント①です [return] *evt2 [er] イベント②です [return] *evt3 [er] イベント③です [return] *evt4 [er] イベント④です [return]
あらかじめ、用意した画像やイベントに規則的な名前をつけるという下準備は必要ですが、これで同じような命令をいくつも書く手間が省けています。
また、後から項目を増やしたい、とか位置を調整するのも修正箇所が少なく済みます。
まとめればいいってもんでもない
ってまとめたい~って言っておきながら、なんでもまとめればいいってもんでもない、とも思ってます。
まとめることを優先して、作業時間がかかってしまったり、まとめすぎて後から見た時にわかりにくくなってしまうってこともあったり。
第一の優先はゲームを完成させることだと思ってます。ソースがどうであれ動いていれば良し。
完成してないのに、綺麗にまとめて書くことを優先していつまでも進まない、ってなったら勿体ない!
次に大事なのはバグが発生した時にすぐにあそこかな? って思いついてすぐに直せることだと思っています。
その時に、まとめておくよりも羅列しておいたほうがいいって思ったら、それでいいと思います。
できることはまだまだある
冒頭でも言いましたが、プラグインには[for]以外のタグも用意されていて、ループを利用しながらいろんなことができるようです。
が、今はまだピンと来てないので、また実際に必要になった時にいろいろ調べてみたいと思います!