K3の住民

最近はレア社のゲームについては書いていませんが、一応レア社のゲームが一番好きな人です。『雪圀』で"圀"は"国"とほぼ同義ですが、国ではありませんって当たり前か(笑)。

【マリオ64DS】何故ある箇所にぶち当たるとワープするのか

皆さん、お久しぶりです。雪圀です。
今回のテーマは「プレイヤーがある箇所にぶつかるとワープする現象」について
です。


先ず、壁に当たるときの処理について、書いていこうと思います。

壁は、当たると、当然ながらプレイヤーはその壁の地点でぶつかります。そして、
ある特定の操作の場合を除き、プレイヤーは壁より向こうに進めなくなり
止まります。

実はこのときの処理、あることが簡単に起こらないように工夫されているのはご存知
でしょうか。

プレイヤーの移動は、物体の座標を変更することで処理しています。そして、移動
速度は「今の座標から何pxぐらい移動したか」によって変化します。
つまり、1pxずつ動いている、というわけでは無いんですね。微かに瞬間移動して
いる、とでも思えばいいでしょう。
したがって、移動したpxによっては、壁を軽々超えてしまう、なんてことも
ありえます。
そこで、マリオ64DSでは、それが起こらないように壁の向こう側のある程度の範囲に
移動すると、壁に押し戻されるように、自動で数px移動するようになっています
(おそらく移動したpx分それより多く反転させて移動しているのだと思われる、理由
は後述)。
イメージとしてはこのような感じです。オレンジがプレイヤーです。

f:id:ryoryoau24:20170929215226p:plain
マリオ64DSの壁の仕組み

これがワープの原因です。でも、これだけだと「何故ワープするのか」が
分からないと思います。

そこで考えたのが、移動処理の順番です。
例えば、右斜め上にプレイヤーが移動するとします。すると、x座標、y座標これら2つ
の座標を変更する必要があるのは分かるでしょうか。
これは別々の処理である必要があり、「x軸に数px移動→y軸に数px移動」という感じ
でプログラムを書かなければなりません。要は、斜め方向への移動は最低でも
2ステップ*1必要となります。

そして、壁に当たったときにx軸が壁の向こう側の範囲に移動し、その次にy軸に数px
移動することを考えてください。
x軸に移動するはずが、y軸に移動することになってしまい、それでy軸に押し戻されて
しまうのです。
更に、この押し戻される処理は壁だけで無く床、天井にもあります。ということは、
以下のようなことが考えられます。

f:id:ryoryoau24:20170929224053p:plain
ワープの原因

プレイヤーが壁を超え、y軸に押し戻されるのを繰り返し、結果ワープしてしまい
ます。それだけだと「何故?」と思われるかもしれません。

しかし、先ほど書いた「移動したpx分それより多く反転させて移動している」という
ことを考えてみましょう。
これも予測の範囲でしかありませんが、おそらく押し戻すとき、移動したy軸分数倍
して移動しているのでは無いかと思われます。
つまり、これによってy軸が多大な数のpx分移動してしまうのでしょう。

したがって、これは「壁の向こう側の上に床が無いと出来ないバグ」であると言う
ことが言えます。


以上です。まだ予測の範囲が多いので一応「考察」タグもつけときますが、多分
こういうことでは無いか、と思ったので書いた次第です。

今回はこれくらいにしときます。

*1:処理が何行書かれているかの単位