初心者向けfor文追加プラグインの便利な使い方【ティラノスクリプト】

ティラノスクリプト

ティラノスクリプトはfor文のタグがありません。
プログラミングができない人向けに作られているティラノスクリプトでは使うことを想定していないのかもしれません。

が、あえてここでは公式ストアで無料配布されている荻原氏制作の「for文追加プラグイン」について触れていきます。
「for文って何? 使う意味あるの?」とこの便利なプラグインが使われないのはもったいないと思うのです。

ティラノスクリプトに、for文を扱うための4つのタグ
[for][foreach][breakfor][nextfor]を追加するプラグインを作りました。
いままでもラベルと条件ジャンプを駆使すればfor文的な挙動は実装できましたが、
このプラグインを入れることでそれが楽になります。
とくに「配列の要素を順繰りに見ていきながら何かする処理」はずっと楽に書けるはずです。

入手ページにはこのように書かれていますが、現場でのプログラミングの経験・あるいは学習経験がまったくない人ではうまい使い方を思いつかないと思います。
サンプルにも最低限の使い方しか載っていません。

というわけで「for文追加プラグイン」の便利な使い方を解説します。

スポンサーリンク

配列を理解する

入手ページの説明にもあるように、for文は配列と組み合わせて利用されることの多い構文です。
そのためにはまず配列とはどんなものかを理解する必要があります。

普通の配列

以下のコードを見てください。

[iscript]
tf.array = [
"0番目","1番目","2番目","3番目",
]
[endscript]

[emb exp="tf.array[0]"][p]

;結果
0番目
一番最後の要素のあとについているカンマ(,)はあってもなくてもいいのですが、要素を付け加えるときに間違いにくいので、僕は常に一番最後の要素にはカンマをつけるようにしています。

このコードは基本的な配列の使い方と、その中身の確認処理を記述したスクリプトです。
tf.arrayという名前の配列に0番目、1番目……という文字列を格納し、embタグを使って中身を確認しています。

この0番目というのがミソで、配列というものは0から数え始めます。
これを覚えていないと配列を扱う際に些細なミスを招く原因となるので、注意してください。

たとえば今回のtf.arrayは4つの要素を詰め込んだ配列ですが、最大で3番目までしかありません。
実際に使うときはtf.array[4]とか存在しない数値を指定しないようにしましょう。

2次元配列

2次元配列は多次元配列というものの一種なのですが、3次元配列やら4次元配列やらは頭が混乱するのでほぼ使いません。
なので説明は省略し、2次元配列のみ解説します。

実は配列の中には配列を入れることができます。
次のコードを見てください。

[iscript]
tf.array2 = [
["0-0番目","0-1番目","0-2番目","0-3番目"], //0番目の配列
["1-0番目","1-1番目","1-2番目","1-3番目"], //1番目の配列
["2-0番目","2-1番目","2-2番目","2-3番目"], //2番目の配列
]
[endscript]

[emb exp="tf.array2[1][2]"][p]


;結果
1-2番目

配列の中に配列を入れるこの構造を「2次元配列」と呼びます。

上記のコードは2次元配列とその中身をembタグで表示するスクリプトです。
今回は1番目の配列に入っている2番目の要素を取り出してみました。

2次元配列はよく九九やエクセルなどに例えられますので、これらをイメージして使ってみるとわかりやすいかもしれません。

for文(foreach文)で配列を制御する

ここまで読んで、「配列だとか2次元配列だとかよくわからん! 普通に変数使ったほうが早くね?」と思った人も多いと思います。
プログラミングに慣れていない人だと、そのような疑問が湧いてくるのは当然です。

ここでfor文とforeach文が出てきます。
ちなみにforeach文は拡張for文とも呼ばれ、その名の通りfor文の仲間です。
普通のfor文より配列の制御に特化したものをforeach文といいます。

正直、foreach文を知ってしまうとfor文をめったに使わない気がするので、この記事ではforeach文のみを解説します。

foreach文の使い方 基本編

以下が基本のコードです。似たようなサンプルコードがプラグインにも同梱されていますが、一応再確認。
for文追加プラグインはすでに読み込まれているものとします。

[iscript]
tf.array = [
"0番目","1番目","2番目","3番目",
]
[endscript]

[foreach name="tf.item" array="tf.array"]
[emb exp="tf.item"]。
[nextfor]
[p]

;結果
0番目。1番目。2番目。3番目。

nameに指定した変数に一個ずつ配列の中身を格納し、embタグで表示しています。

for文とforeach文の大きな違いは、ループ回数などを指定しなくても自動的に配列の要素数に合わせたループ処理をしてくれて、要素がなくなったら終了してくれる点です。
ただ、普通はこんな使い方をしないはずなので、解説記事として読んでくださっている方の頭の中にはまだハテナがたくさん浮かんでいると思います。

foreach文の使い方 実用編

というわけでここから実用編に入っていきます。
以下のコードは実際に僕がゲームのタイトル画面で書いているスクリプトに近いものです。

[iscript]
f.titleBtn = [
//text target
["はじめから","gamestart"],
["つづきから","load"],
["環境設定","config"],
]
tf.y = 200;
[endscript]
[foreach name="tf.item" array="f.titleBtn"]
@glink text="&tf.item[0]" width="300" target="&tf.item[1]" x="600" y="&tf.y"
@eval exp="tf.y = tf.y + 70"
[nextfor]

foreachの前にf.titleBtnという名前の2次元配列を作り、その中にのちに使う文字情報とラベル情報を格納しています。
今回arrayに指定した配列f.titleBtnは3つの配列を格納しているため、ループは3回おこなわれることになります。


画面の表示をみるとこんな感じです。

スクリプトにはglinkが1つしか書かれていないにも関わらず、ボタンが3つ表示されています。

コードを読み解く

処理の内容を詳しく見ていきます。

前提

  • ループ中はwidthの数値は300のまま変更しない
  • ループ中はxの数値は600のまま変更しない
  • iscriptによってあらかじめtf.yには200が入っている

一回目のループ

  1. f.titleBtn[0]の中身がtf.itemにコピーされ、tf.item[0]が「はじめから」、tf.item[1]が「gamestart」になる。
  2. tf.item[0]に入っている文字をtextに、tf.item[1]に入っている文字をtargetに、tf.yの数値をyに指定してglinkを作成。
  3. evalタグでtf.yの数値が70増え、270となる。

二回目のループ

  1. f.titleBtn[1]の中身がtf.itemにコピーされ、tf.item[0]が「つづきから」、tf.item[1]が「load」になる。
    (前回のループによってtf.yには270が入っている)
  2. tf.item[0]に入っている文字をtextに、tf.item[1]に入っている文字をtargetに、tf.yの数値をyに指定してglinkを作成。
  3. evalタグでtf.yの数値が70増え、340となる。

三回目のループ

  1. f.titleBtn[2]の中身がtf.itemにコピーされ、tf.item[0]が「環境設定」、tf.item[1]が「config」になる。
    (前回のループによってtf.yには340が入っている)
  2. tf.item[0]に入っている文字をtextに、tf.item[1]に入っている文字をtargetに、tf.yの数値をyに指定してglinkを作成。
  3. evalタグでtf.yの数値が70増え、410となる。

ここでf.titleBtn配列が終了するため、ループを終了。

for文を使う理由はメンテナンス性にある

「これだけならglinkタグを3回書いたほうが簡単ではないか」と考える人もいるでしょう。
それはそのとおりで、いちいち配列だなんだと覚える必要がないので簡単なのは間違いありません。

ここでfor文を使う意味は「メンテナンス性を高める」ことにあります。
その「メンテナンス性」とはなにかをこれから実演しながら説明していきます。

今は真っ黒なのでボタンがどこにあっても気になりませんが、今度は背景を表示することにします。

bgタグで背景を追加します。

ティラノスクリプト公式キャラクター、我らがあかねちゃんの顔がボタンによって覆い隠されました。
これではいけません。見栄えが最悪です。

ということでボタンの位置を左下に移動させたいと思います。

さて、このときに配列とfor文を駆使してglinkを設置していたか、それともglinkを単に3つ書いていたかで、修正作業にかかる手間が大きく違ってきます。

普通にglinkを3つ書いていた場合、すべてのボタンのxやyを左下寄せに書き換えていかなければなりません。
単純に三回座標修正の作業が入ります。

しかし、今回のように配列とfor文を駆使してボタンを表示していた場合、修正は1つのglinkタグのxとyだけで済みます。


ということで書き換えてみます。

[iscript]
f.titleBtn = [
//text target
["はじめから","gamestart"],
["つづきから","load"],
["環境設定","config"],
]
tf.y = 350;
[endscript]
[foreach name="tf.item" array="f.titleBtn"]
@glink text="&tf.item[0]" width="300" target="&tf.item[1]" x="30" y="&tf.y"
@eval exp="tf.y = tf.y + 70"
[nextfor]

書き換えたのはiscript内のtf.yの数値、glinkタグのxだけです。

あかねちゃんの顔が見えるようになりました。

このように「修正する際、かかる手間が少なくなること」を「メンテナンス性が高い」といいます。
一般的な変数を使いこなしている方なら、なんとなく意味はわかるのではないでしょうか。

ちなみにここまで触れてきませんでしたが、yをわざわざtf.yで指定しているのもメンテナンス性を高めるためですね。

for文が回るごとにどのくらい前のボタンから離れさせるかを指定するだけでいいので、「やっぱもう少し離れさせたほうがよかった」と思ったときにevalタグの「tf.y+70」を「tf.y+80」に変更するだけでボタン同士の距離が80に変更できますし、今回のようにボタン全体を大きく移動させたいとき、tf.yの初期値を書き換えるだけでよくなります。

コメント