Game Maker Language リファレンス > 組み込み関数 用途別 > リソース操作 > リソース操作・シーケンス > イベント・モーメント・ブロードキャストメッセージ
リソース操作・シーケンスにリストされているシーケンス構造体のすべてのプロパティとは別に、特別な「アクション」プロパティをシーケンスに追加することもできます。 シーケンスオブジェクトに追加できるこれらの「アクション」プロパティには、3つの異なるタイプがあります (イベント・モーメント・ブロードキャストメッセージ)。これらのそれぞれについては、以下のセクションで詳しく説明します。
シーケンスオブジェクトにはイベントを追加できます。これらのイベントは、オブジェクトアセットで使用されるイベントに類似しています。 シーケンスオブジェクトに割り当てるイベントは、シーケンスライフサイクルの定義された瞬間に1回、またはシーケンスが実行されているフレームごとに、特定の順序で発生します。 このセクションでは、これらのイベントがコードを使用してどのように処理されるかについて説明しますが、シーケンスエディターを使用して追加することもできます。 ここにリストされているイベントの順序は再生ヘッドの方向に影響されないことに注意してください。シーケンスが逆方向に再生されている場合でも、イベントは以下の順序で実行されます。
利用可能なイベントは次のとおりです。
すべてのイベントは、スクリプトで定義された関数に関連付ける必要があるため、イベントをセットアップするには、メソッドを、どのイベントが関数を呼び出すかを示す正しい名前のプロパティに割り当てる必要があります。 この構文は次のとおりです。
<sequence_struct>.<event_property> = method(<sequence_struct>, <function_name>);
さまざまなイベントのシーケンス構造体プロパティは次のとおりです。
使用例として、マウスの左ボタンのクリックが検出されたときにシーケンスを逆方向にしたいとします。 まず、次のような、呼び出す関数を含むスクリプトを作成する必要があります。
/// @function seq_reverse(); function seq_reverse() { if mouse_check_button_pressed(mb_left) { if self.headDirection == seqdir_right { self.headDirection = seqdir_left; } else self.headDirection = seqdir_right; } }
この関数では、マウスクリック時に、メソッドがバインドされているシーケンスの再生方向を逆にするだけです。 現在、これらのプロパティにリンクされている関数にパラメーターを渡すことができず、すべての場合において、関数のスコープ内のself変数がシーケンスインスタンスに割り当てられています。
これをシーケンスに割り当てるには、次のようにします。
var _seq = sequence_get(Sequence1); _seq.event_step = method(_seq, seq_reverse);
これで、マウスが押されたときにそれを検出し、シーケンスインスタンスが部屋で作成された後にシーケンスインスタンスの再生ヘッドの方向を変更する関数を使用して、シーケンスイベントにステップイベントを割り当てました。
シーケンスモーメントは、シーケンスの再生時に1つ以上の指定されたフレームで発生する一意のコードアクションです。 これらのコードモーメントは、(上記で説明した)イベントと同様に、特定のフレームでトリガーされる事前定義されたメソッド変数です。 たとえば、シーケンスでアニメーションの特定のフレームに「obj_Bullet」インスタンスを作成したいとします。最初に、このアクションに使用する関数を作成する必要があります。たとえば、次のようにします。
/// @function seq_shoot(); seq_shoot = function() { instance_create_layer(sequence.xorigin, sequence.yorigin, "Instances", obj_Bullet); }
次に、これをシーケンス構造体のmomentKeyframesプロパティのフレームに追加します。 これは基本的にこの目的でのみ使用される「特別な」トラックであり、シーケンスに必要なモーメントアクションに関連付けられたキーフレームデータのみを取得できます。 このトラックは、他のトラックを作成するのとほぼ同じ方法で作成されます。キーフレーム構造体を作成し、それらにキーフレームデータを入力します。チャネル0は使用できる唯一のチャネルであり、トラックタイプはseqtracktype_momentです。 以下に、これを作成する方法の例を示します。上記で定義した関数を使用して、所定の瞬間(フレーム)で発火します。
var _seq = sequence_get(my_Seq); var _k = array_create(3); _k[0] = sequence_keyframe_new(seqtracktype_moment); _k[0].frame = 60; _k[1] = sequence_keyframe_new(seqtracktype_moment); _k[1].frame = 120; _k[2] = sequence_keyframe_new(seqtracktype_moment); _k[2].frame = 180; var _d = array_create(1); _d[0] = sequence_keyframedata_new(seqtracktype_moment); _d[0].channel = 0; _d[0].event = method(_d[0], seq_shoot); _k[0].channels = _d; _k[1].channels = _d; _k[2].channels = _d; _seq.momentKeyframes = _k;
上記のコードは、「モーメント」トラックのフレーム60、120、および180を設定して、メソッドseq_shootを呼び出すだけです。 現在、各瞬間に使用される関数にパラメーターを渡すことができず、関数のスコープ内の自己変数がシーケンスインスタンスに割り当てられていることに気づくでしょう(通常、 自分自身を使用する必要がありますが、いくつかの特殊なケースでは便利な場合があります。
シーケンスを作成して、アニメーションタイムラインに沿って特定のフレームに追加される単純な文字列であるブロードキャストメッセージを生成できます。タイムラインのそのポイントに到達すると、文字列は、それをリッスンするすべてのオブジェクトインスタンスにブロードキャストされます。 これらのメッセージは、シーケンスエディターを使用してIDEで追加できますが、コードを使用して作成および編集することもできます。
GMLを使用してシーケンスにブロードキャストメッセージを作成するには、シーケンス構造体のmessageEventKeyframesプロパティのフレームにメッセージを追加する必要があります。 これは、本質的にはこの目的でのみ使用される「特別な」トラックであり、シーケンスに必要なブロードキャストメッセージに関連付けられているキーフレームデータのみを取得できます。 このトラックは、他のトラックを作成する場合とほぼ同じ方法で作成されます。キーフレーム構造体を作成し、それらにキーフレームデータを入力します。チャネル0は使用できる唯一のチャネルであり、トラックタイプはseqtracktype_messageです。 以下は、これを作成する方法の例です。
var _seq = sequence_get(my_Seq); var _k = array_create(2); _k[0] = sequence_keyframe_new(seqtracktype_message); _k[0].frame = 60; _k[1] = sequence_keyframe_new(seqtracktype_message); _k[1].frame = 120; var _m1 = array_create(2); _m1[0] = "Hello"; _m1[1] = "World"; var _m2 = array_create(1); _m2[0] = "This is a Broadcast Message"; var _d1 = array_create(1); _d1[0] = sequence_keyframedata_new(seqtracktype_message); _d1[0].channel = 0; _d1[0].events = _m1; var _d2 = array_create(1); _d2[0] = sequence_keyframedata_new(seqtracktype_message); _d2[0].channel = 0; _d2[0].events = _m2; _k[0].channels = _d1; _k[1].channels = _d2; _seq.messageEventKeyframes = _k;
メッセージテキストが配列としてキーフレームデータチャネルに渡されることがわかります。 これは、同じフレームで複数のメッセージをブロードキャストし、異なるオブジェクトインスタンスにそれらをリッスンさせ、実際に期待するメッセージに応じて異なる反応をさせることができるためです。
シーケンスによってブロードキャストメッセージが発行されたら、オブジェクトインスタンスで[その他]> [ブロードキャストメッセージ]イベントを使用してメッセージを解析できます。これについては、ここで詳しく説明します。