まったりFuropenブログ

ではごゆっくり

スーパーマリオブラザーズ3 壁抜けについて(原理編)


スーパーマリオブラザーズ3の壁抜けの原理について、調査結果を記しておきます。
これはFC版、NES版の調査です、マリコレ版は調べていませんが同じだと思われます。





6-10や7-2の場合のように、マリオが足場に立っているときに、
その頭にブロックが重なっているとき右にスライド
していきます。

これが壁抜けの原理となります。





7-1の壁抜けの場合、上図で見て右下のブロックに乗ることで、
マリオが足場に立っていることになり、頭がブロックと重なるため右にスライドします。

右下のブロックに乗るためには、マリオを壁に少しめり込ませることになります
ここでマリオの速度が重要になります。

マリオの速度は以下の通りです。
 ・ダッシュボタンを押してない時の最大速度:24サブピクセル/フレーム
 ・ダッシュボタンを押している時の最大速度:40サブピクセル/フレーム
 ・ダッシュ状態の時の最大速度:56サブピクセル/フレーム
以降ピクセルをpx、サブピクセルをspxと略します。

spxとは小数点のようなものと考えると分かりやすく、1px=16spxになります。
例えば速度40spxなら、1フレームで2pxと8spx進むことになります。

(参考データ)
 1pxとはゲーム画面内でどの程度の大きさかといいますと
 マリオの体は、おそらくですがこのようになっていると思われます。
  横幅:16px、12px
  高さ デカマリオ:26px しゃがみ状態:16px

 また、マリオ3によくある1つのブロックは1辺長さ16pxの正方形です。


普段のプレイでマリオを壁にぶつけていますが、その全てが壁にめり込んでます。
壁にめり込むと、速度が0にされ、毎フレーム1px壁の外に押し出すようです。

例えば、マリオの座標が12pxの0spxにいて、速度が右方向に40spx、
そして目の前に壁があり、壁の左端座標が13pxにあるとします。
この時のマリオの1フレーム後の位置は、速度を足した14pxの8spxになりますが
これは壁にめり込んでいるため押し戻され13pxの8spxに移動することになります。

壁にめり込むことができることが分かりますが、
ブロックに乗るには何px壁にめり込めば乗れるかを知る必要があります。
これは、そこら辺にあるブロックの角に乗れば分かります。
結論を言うと、ブロックの端から3px目に乗ればブロックに乗ることができます。
つまり、壁に3px以上めり込まないとブロックに乗れないことになります。


※マリオの見た目に騙されやすいですが、端から3px目に乗っています


7-1では基本的に速度右方向に40spxで壁抜けを行います。
つまり速度40spxで壁に3pxめり込ますことになります。
壁の左端の座標が13pxにあるとしたら、
3pxめり込んだ位置である15pxにマリオが到達しなければいけません。

ここから逆算すると、マリオの座標は12pxの8spx~15spxにあるときが答えです。

マリオの座標がこの僅か8spx分の間の時しか、壁抜けができないことが分かります。
しかし速度は40spxです。
速度を微調整しない限り、その僅かな8spxに持っていくには運が絡んでしまいます。
(速度や座標を正確に調整するのは非常に困難であり、これは運ゲーですね。)
従って、40分の8=5分の1の確率で壁抜けの条件を満たすことが分かります。

ただしこれだけでは壁抜けには不十分で、高さ方向について検討する必要があります。
そちらについては、別記事で説明しますが、こちらは運ゲーにはなりません。


【オマケ】
 7-9の壁抜けのようにPダッシュで壁抜けをする場合

 速度が56spxであり、先ほどの7-1の場合と比べ16spx速いことになります。
 ブロックに乗るため、壁に3pxめり込ますのですが、
 マリオの座標は合計で24spxの猶予があることが分かります。
 従って、56分の24=7分の3の確率で壁抜けの条件が満たされます。