MMF2 でループ処理を考える # 2
MMF2 が標準で使うループ処理「高速ループ」について。
単純な仕様なので扱いが簡単です。覚えるべきルールはまず三つ。
-
ループに名前を付けること
-
何回ループするかループ数を決める
-
名前を付けたループを実行中、今何回目のループなのか知るためにはループインデックスを取得する
ループインデックスは 0 から始まります。
25 回ループする場合、インデックスは 0 から始まり終わり値は 24 。
高速ループ処理中に条件を判断してループ処理を途中でも終わりたい場合には「ループの停止」または「現在のループ回数を変更」を実行させます。
アクションループ/ Action Loops :通し番号処理とか
[2012 年 04 月 13 日追記]:名前が分かったので修正します。暫定的に「隠しループ処理」と記述していたループ処理の名前は正式に「アクションループ/ Action Loops」と呼びます。
前回話の流れでループ処理の一つに「 ForEach 」が出てきました。
「 ForEach Object 」はエクステンションですが、MMF2 は一部で「 ForEach 的なループ処理」を自動、しかも標準で行っている部分があります。
つまりオブジェクトの数に応じてループ処理をするという MMF2 風の ForEach ループです。このループ処理を「アクションループ/ Action Loops 」と呼びます。このループの簡単な例はランダムな数値を複製で作った 25 個のオブジェクトの変数 A に代入する際の指定の仕方を考えてみて、というもの。
答えはこの一行で完了。
25 個全てのオブジェクトの変数 A に対してランダム値の代入がこれで済むということは、つまりフレームが開始時にはまずここでオブジェクト数に応じて変数 A への代入をループ処理してるようなものです。
そしてこれと似たような処理にもう一つ「通し番号」があります。
「通し番号」は「高速ループ」で言う所の「ループインデックス(いま何回目のループ処理中だよと教えてくれる数字)」のようなものです。
通し番号もオブジェクトの数だけ自動で実行してくれる ForEach 的なループ処理ですが、通し番号の特徴は始値を自由に設定できると言う点。どういうことかというと、高速ループと違ってループインデックスは必ず 0 から始めなくても 10 からでも 100 からでも良い、ということです。
これも前回の基礎概念で出てきた「 Super Function 1.1 」の機能に近いです(増加ステップを変えることはできないけど)。
実際のループ処理とその使い分けを知る
このようにアプリケーションを作る上で重要な概念であるループ処理は MMF2 では 3 つあって、「メインループ(ゲームループあるいは MMF2 的にはイベントループとも)」「アクションループ/ Action Loops 」と「高速ループ」です。
「高速ループ」の実際の使用例はオブジェクトの衝突判定などに代表されます。
しかし「高速ループ」は汎用的なループ処理なのでコレ以外にも多くの用途があります。
一方「アクションループ/ Action Loops 」は複数オブジェクトの変数に対する「代入」や「通し番号」などに活用されます。
次回記事で簡単なサンプルを出しますので、「高速ループがわからない」あるいは「通し番号がわからない」と言う人は MMF2 のゲームループ内で利用される 二種類のループ処理について慣れる必要があります。
-
「高速ループ」→衝突判定・新規オブジェクトの作成等
-
「アクションループ/ Action Loops 」→変数への代入・通し番号
通し番号について:補足
25 個のオブジェクトをフレームエディタから「複製」で作った場合に通し番号を 1 から割り振るとした場合、つまり 「複製」で一番最後に作られたオブジェクトが 一番最初に通し番号を頂く(内部番号が一番若い)ので = 1、一番最初に作られた 一番古いオブジェクト(内部番号が一番古い)が 一番最後の通し番号を頂きます = 25、という仕様です。
ちょっと最初は分かりにくいはず。
この順をひっくり返したい場合、つまり古い方から 1、 2、 3 と通しを割り振りたい場合は計算で工夫できます。例えばオブジェクト総数が 25 個で通し番号の開始が値 1 からの場合、オブジェクト総数に +1 (通し番号の開始数)した値から実際に割り振られた通し番号を引き算すれば求められます。
MMF2 の豊富な計算機能を用いれば通し番号は割り振り方にも工夫ができます。通し番号を動的に切り替えることで複数のオブジェクト動作を一括して切り替えるとかもできます。アクションループ(通し番号)も高速ループも根っこは同じループ処理(繰り返し処理)ですが用途はまったく違ってきます。難しいと感じるかすぐに便利と感じるかは個々の予備知識で差が出ると思います。