動作の選択と排他的処理について
GMS では物理動作
と通常動作
は厳密に区別されます。
各 ROOM で設定された物理専用のWorld
中でのみ、物理動作が適用されたオブジェクトは物理的オブジェクトとして、その振る舞いがシミュレートされます。
参考:The Physics World
物理(physics
)動作を適用したオブジェクト・インスタンスは Wrap などを含めた通常の x,y 位置座標指定による移動命令などが無効化
されます。これが排他処理です。
物理動作は簡易ながらもパラメータに基づいて算出されたシミュレーションとその結果であり、シミュレーション中に対象のオブジェクト・インスタンスを通常命令で動かされる(=ワープされる)と結果に齟齬をきたすため、物理と通常で関数を分け動作を隔てた排他的処理が必要となります。
物理と通常がまったく異なるものであること、これらはオブジェクトの物理的特性を色付けする Fixtures などを見ることでも理解できます。
“reactive” システムと “passive” システム
物理動作中は特にコリジョン(衝突)が通常と物理で内部的には全く異なった処理が施されています。
小難しいことを別に知りたくもない場合は唯一、
- 物理と通常は動作原理が違うんやで〜
これだけ覚えておけば大丈夫です。
参考:Physics Functions 参考:物理エンジンについて(Game Maker まとめ Wiki内記事) Game Maker まとめ Wiki 内の記事はソースが記載されていないが、たぶん上記ヘルプが原文
もう少し詳細に “reactive” システムと “passive” システム
GMS における通常のゲーム動作で利用されてる衝突判定処理を”reactive” system と呼びます。
Reactive(リアクティブ/反応型) = 通常の GMS における衝突判定処理
“reactive
“というのは「反応」という意味で、衝突というイベント・トリガーに反応した後に定義されたアクションが実行されるのが “reactive” system。後述される “passive(受動的)” との比較だと “reactive
” の方は能動的と言えます。
“reactive” system は比較的少ない数のオブジェクト・インスタンスを対象にして、動作定義に基づいた処理を行う場合に有効な手段とされます。
しかし物理ベースで大量のインスタンスを扱い、各インスタンスが選択などによってそれぞれ異なった振る舞いをするなど、このような場合に “reactive” system では処理が追いつかなくなります。
そこで効率的に処理するアルゴリズムとして GMS が物理動作で採用しているのが"passive" system
です。
Passive(パッシブ/受動型) = GMS における物理動作での衝突判定処理
一口に「パッシブ」と言われても「いまいちピンとこない」話ですが、そこで先ほど話に出た物理的特性を色付けする Fixtures です。
パッシブ型はオブジェクトの物理的特性をパラメータを通じて事前に決定し、これらパラメータを元にシミュレーションが行われます。ROOM 内でオブジェクト・インスタンスが生成された後に、Box2D の World 内でどのようにインスタンスが振る舞うかは予め物理エンジン内で決定されています。
“reactive” に対して"passive"
は物理エンジン内で常時機能します。
オブジェクトの振る舞いはパラメータを元に計算で導きだされたものとなり、結果的に何もコードを書かなくとも物理オブジェクトは重力と慣性が働いて下に落ちるし、衝突したら弾性に応じて跳ね返るし、質量や摩擦係数に応じて減速したりします。
Physics 専用関数群
物理動作を適用したオブジェクト・インスタンスのコントロールには physics 系専用の関数群を利用してください。
例えば通常動作で利用される speed や direction などについて、物理動作ではそれぞれ Force と impulse が対応するなど、物理で利用される概念は通常動作で利用されている概念と似ているものがあるけれど、名称などはそれぞれ物理動作用になっています。