高速ループ、ForEachループについて

前回はイベントの種類について解説しました。
今回は『イベントループ』と、ループにおける『高速ループ』と『ForEachループ』について解説します。

『高速ループ』と『ForEachループ』については本家Clickteamフォーラムにあるガイドも合わせてご覧ください(英語)。
– An introduction to Fastloops and ForEach Loops (Built-In)
http://community.clickteam.com/threads/86779-An-introduction-to-Fastloops-and-ForEach-Loops-(Built-In)

■イベントループとは
『イベントループ』とは、『アプリケーション実行時に、イベントエディタに記述されたイベントを上からチェックして、条件を満たしたものを実行するサイクル』のことです。
イベントループは1フレーム毎に行われます。アプリのフレームレートが60であれば、1秒間に60回実行されることになります。
cf25_blog_2015-09-23_eventeditor
↑イベントエディタの画面。アプリを実行すると、毎フレーム一番上からチェックされ、条件を満たしたイベントが実行され、画面に反映されます。

■高速ループとは
通常、イベントは1回のイベントループで1回しか実行されません。『高速ループ(Fast loop)』を使うと、その1回のループ中にイベントを複数回実行させることができます。

□高速ループの設定方法
cf25_blog_2015-09-23_fastloop1
『特別』のアクション群から『高速ループ』→『ループを開始』を選択します。
cf25_blog_2015-09-23_fastloop2
ループ名を設定します。その後、ループ回数を設定します。

□イベントの条件に高速ループのトリガーを設定する
cf25_blog_2015-09-23_fastloop3
高速ループをトリガーとして実行させたいイベントの条件に、新規条件から『特別』→『ループが実行中』を選択します。続けて、先の『ループを開始』で宣言したループ名を入力します。
cf25_blog_2015-09-23_fastloop4
ループ以外にトリガーとしたい条件がある場合は、その下へ追加で設定していきます。

□高速ループの使い道の例
高速ループは1回のイベントループ内で複数回イベントを実行させるものです。実行時には1瞬で同時に実行されたように表示されます。
高速ループを使わずに変数を1ずつ増やすと、10まで増えるのに10フレーム掛かりますが、高速ループを10回回して1ずつ増やせば1フレームで10増えます。

  • フレーム開始時にイベントでステージを構築させるタイプのゲームの初期化
  • 同時に複数の方向へ弾を撃つ敵の攻撃で、それぞれの方向毎に複数イベントを用意しなくても、ループによって複数回実行させることでイベント自体は1つで済む
  • 精密にキャラを移動させて衝突判定を正確に行う
    高速ループを使わずにキャラを10ドット移動させると一気に10ドット移動して瞬間移動したようになりますが、高速ループを10回回して1ドットずつ動かせば、見た目は一瞬で10ドット移動したように見えますがプログラム的には1ドットずつ動いているので衝突判定を正確に行えます。

等々です。
その他にも、ループの開始を宣言すればそのループ名が条件になっているイベントが実行されるので、ループ名によってイベントを呼び出す関数的な使い方もできます(ループ回数を1にすれば、通常のイベントと同じく1回のみ実行されます)。

■ForEachループとは
高速ループと似たもうひとつのループが『ForEachループ』です。高速ループとの違いは、ループの対象となるオブジェクトを指定し、ループ回数はフレーム上のそのオブジェクトの数になる、ということです。

□ForEachループの設定方法
cf25_blog_2015-09-23_foreach1
オブジェクトのアクション群から『カウント』→『各オブジェクトにつき』を選択します。日本語表示では『ForEach』は『各』と訳されています。
対象となるオブジェクトが2種類ある(ペアになっている)場合は『各 2 オブジェクトにつき』を選択しますが、別にこちらを使わなくても可能です。

cf25_blog_2015-09-23_foreach2
トリガーとなる条件を設定するにはオブジェクトの条件から『ループ』→『各オブジェクトにつき』を選択します。

cf25_blog_2015-09-23_foreach3

□ForEachの使い道
ForEachループは基本的に『フレーム内に複数存在する同じオブジェクトの個別制御』で使用します。先述のように1回のイベントループでは記述されているイベントは1回しか実行されません。同じオブジェクトが複数フレーム内に存在していてもその内の1個に対してしか実行されたイベントが適用されない形になってしまいます。ForEachループを使用すれば、イベントはオブジェクトの数の回数実行されるようになるので、複数存在する同じオブジェクト全てにイベントが適用されます。
(アクションやシューティングゲームで、同じ敵が複数画面に居る場合にその内の1体しか動作しない場合等)

□オブジェクトにパーツ(子オブジェクト)をペアリングする
具体的なForEachの使い方として、オブジェクトに別のオブジェクトをパーツとしてペアリングするサンプルをご紹介します。
このサンプルでは2つのオブジェクトをペアリングしているだけですが、3つ以上のオブジェクトに増えても応用が利くよう『各 2 オブジェクトにつき』は使用していません。

– サンプルプログラム
cf25_blog_2015-08-02_line_of_sight.zip

cf25_blog_2015-09-23_foreach_pair1
↑紫のオブジェクト(親オブジェクト)に三角のオブジェクトがパーツ(子オブジェクト)として付いています。

cf25_blog_2015-09-23_foreach_pair2
ポイント1:オブジェクトとパーツ作成イベントにて、パーツの変数に親オブジェクトの固定値を入れます。
※『固定値』とは、全てのオブジェクトにシステムが自動的に与えるユニーク値です。他のオブジェクトと重複することはありません。

cf25_blog_2015-09-23_foreach_pair3
ForEachループを回します。条件は『常に実行』でも良いのですが、オブジェクトが居なくなればループを回すイベント自体が実行されなくなるように、オブジェクトのフラグを条件にしています(フラグ0は常に無効のままにする)。
ポイント2:位置合わせイベントでは、子オブジェクトを親とペアリングするために、作成時に子の変数に与えた親の固定値と、実際の親の固定値を比較する条件を加えます。親の固定値と、子の変数が一致すれば、その2つはペアとして選択されます。

■ループインデックスについて
ループインデックス(現在何回目のループかを示す番号)は0から始まります。数式でカウンタ等にループインデックスを取得した場合、1回目のループは0と表示されますのでご注意ください。

cf25_blog_2015-09-23_fastloop_index
cf25_blog_2015-09-23_foreach_index
高速ループ・ForEachループ共に数式からループインデックスを取得することができます。インデックスで比較して、特定のインデックスの時だけ異なる処理をさせる、といったことも可能です。

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.