CF25 と GMS1.4 はどちらも物理エンジンに Box2D を利用している。しかし実装が異なるため動作を作る際にも作法とか異なってくる。
排他的処理
一番大きな違いは排他的処理にある。
Box2D は物理動作をシミュレートするために専用の Physics World を作ってから、オブジェクトに物理特性を与えるためのデータを構造体として渡している。
GMS は「通常動作」の場合と Physics を使った「物理動作」で異なったそれぞれ専用の構造体を渡していて、コリジョン判定なども通常動作と物理動作で判定アルゴリズムが異なるとドキュメントに書いてあった。
GMS では衝突判定以外にも座標指定による位置変更は通常動作と物理動作でそれぞれ異なった関数が用意されていて、物理動作中のオブジェクトに通常の座標変更指定は無効化されるよう完全な排他処理が施されている。
排他処理は必要
シミュレーション結果に破綻を生じさせないためには GMS の実装の方が正当だ。
で、これに関しては Construct2 でも排他処理が実装されている。ただし C2 の方は物理動作中に通常の位置指定が行われた場合は通常の位置指定命令が優先実行され、物理動作はその時点で一旦リセットされるようになっている。
リセットされるとはどういうことか
例えば重力の影響で落下していく物体 A の等加速度直線運動を例にすると、物体 A は落下しながら地面への衝突まで時間経過とともに加速度を増して行く。
ではこの落下中の物体 A に対して物理的なしがらみを一切無視した座標指定による位置変更(いわゆるワープ)を試みた場合、各ソフトウェア毎に対応が異なる。
そして C2 の場合はやはり排他処理なんだけど、座標指定による位置変更命令の方を一旦物理より優先する。そして物理動作中だった物体 A は落下中に得た加速度がリセットされて、次回新しい座標から再度自由落下を開始するという具合になっている。
GMS の方は通常と物理で異なった構造体を渡されて、物理動作中のオブジェクトに通常の位置指定した場合、その命令は無効化処理。ただし Physics World 内限定の座標指定による位置変更命令がサポートされているため、そっちの関数を使えば強制的にワープできる。C2 と異なる点として、強制的に位置変更をしても時間経過とともに得た加速度的な値はリセットされずに持続される。
つまり GMS では物理的しがらみを無視して物体 A が落下中にどっかへワープしても、物理専用の命令形ならワープが許されているし加速度なども保持されてる。すると結果的にこういう動作を GMS では作れる。
参考URL:GMS1.4 Basic Physics Movements ::: TEST
各ボックスが加速度を維持したまま左から右へ移動し Wrap してるだけの動作だけど、実際にこの動作を内蔵の Physics で作ろうとした場合、各ソフトで実装されている排他処理を考慮しないと作れなくなる。
CF25 は?
CF25 は物理動作と通常動作が区別されていない。つまり自由落下中の物体 A を通常の座標指定命令=ワープが可能。排他処理自体が無い。
そして排他処理して無くとも一見するとちゃんと動いているのだけど、おもしろいことにやはり時間経過とともに動作はいずれ破綻するようになっている。シミュレーション結果がだんだん破綻していくのだ。
以下に例を示す。
参考URL:GMS1.4 Basic Physics Movements ::: TEST
これを見ていると CF25 のはたぶん仕様なんだと思う。各エクスポータが共通した動作をしていて、SWF でも HTML5 でも、あるいは PC でも物理動作に破綻が生じる。ただし PC の場合、もうすこし大きめのフィールドで動かさないと破綻が生じるまでにかなり時間がかかると思う。