GameMaker Studio で移動するキャラの向きを一定時間ごとに変更したいと思いました。
(GameMaker Studio Professional Edition v1.4.1757)
上の動画は、歩行するゾンビキャラが 1 秒ごとに 90 度単位でランダムに向きを変えています。
最初は、[Step] イベントの呼び出しでメンバ変数に
self.frame_count += 1;
のようにフレームカウントを更新していき、その余剰(mod)を計算しようかと思っていました。
Alarm イベントの設置
しかし GameMaker Studio のオブジェクトには、指定したステップ数が経過したときに呼び出される Alarm と呼ばれるイベントが標準で用意されています。
room_speed が 30 の場合なら、1 秒間にゲームサイクルが 30 ステップ実行されるはずなので、 30 を指定することでおよそ 1 秒後に [Alarm] イベントを呼び出すことができます。
Alarm を呼び出させたいオブジェクトの Properties ウィンドウを開いて、 [Add Event] ボタンを押し、 [Alarm] ボタンを押すと0~11 までの 12 個のアラームをイベントに追加できます。
あとは、他のイベントと同様に、 Action を割り当てます。
Alarm イベントはインスタンスごとに設定できる
この12個の Alarm はオブジェクトのインスタンスごとに設定できます。
最初に Alarm を呼び出したいステップ数を設定します。
[Execute Code] Action を使う場合は、
self.alarm[0] = room_speed * 1; // 1 秒後に Alarm0 イベントを呼び出す。
のように記述します。
私は、 [Create] イベントの中にこのような設定をしました。
Alarm イベントは一度きり
Alarm イベントは繰り返し呼び出されません。
もう一度呼び出したい場合は、 [Alarm] イベントの中に次のように再度設定します。
self.alarm[0] = room_speed * 1; // 再び 1 秒後に Alarm0 イベントを呼び出す。
サンプルの実装
最初にご覧いただいた動画のサンプルは room に obj_zombie_a(ゾンビのスプライトを割り当てたオブジェクト)のインスタンスを 3 つ配置したものです。
obj_zombie_a には次の 3 つのイベントを設定しました。
[Outside Room]イベントはインスタンスが Room の外側にいった場合のイベントで、反対側から再びでてくるように [Wrap] アクションを both で設定しています。
他の2つのイベントは [Execute Code] アクションを指定して次のコードを書きました。
Create イベントのコード
self.image_speed = 0.3; // スプライトのアニメーションの速度
self.image_index = 0; // 最初に表示するスプライトのフレーム番号
self.speed = 1; // 移動速度
self.alarm[0] = room_speed * 1; // 1 秒後に Alarm0 イベントを呼び出す。
Alarm の設定のほかに、スプライトのアニメーション、インスタンスの移動速度を設定しました。
Alarm0 イベントのコード
self.direction = 90 * round(random(4)); // インスタンスの向きをランダムに変更
self.alarm[0] = room_speed * 1; // 再び 1 秒後に Alarm0 イベントを呼び出す。
Alarm の設定のほかに、向きを90度単位でランダムに変更しました。
余談ですが、 random は小数を返すため round で整数に丸めないと 90 度以外の向きにも変わるようになります。