まったりFuropenブログ

ではごゆっくり

スーパーマリオブラザーズ3 サブピクセルマニピュレーション(調整方法編)




文字通り、サブピクセル(以下spxと略)を操作する手法です。
なぜこんな手法をするかというと、壁抜けにおいて役に立つからです。

具体的な壁抜けへの効果は次記事以降で書きます。
まずは本ページでは、どのような行動を取ればspxを調整できるかをご紹介します。


以前の記事で、spxはpx(ピクセル)の小数点のようなもの、
そして1px=16spxであると紹介しました。

左右方向だけがspxを持つということではありません。
 左右方向のpxをpx(x)、spxをspx(x) (右方向が+)
 上下方向のpxをpx(y)、spxをspx(y) (下方向が+)
とこれ以降させていただきます。


マリオは、spxが変動しても画面上では移動しません。
例えば、毎フレーム1spxの速度で移動し続ければ、
spxが繰り上がる15→0spxになる時、マリオが画面上で1px動くことになります。
また、反対方向に動けばspxが繰り下がる、0→15spxのときマリオが1px動くでしょう。
これらの画面上動きを利用し、
 1フレーム右キーを押して離す→マリオは動かないな・・・
 もう1回1フレーム右キーを押して離す→まだマリオは動かないな・・・
 もう1回1フレーム右キーを押して離す→マリオが動いた
速度(右を押した量)によりますが、十分に速度を落としていた場合、
マリオが動いたということでspxは0付近であるということが予測されます。
サブピクセルマニピュレーションはこのような考えで行われます。


さて、速度仕様について覚えていますでしょうか?
(忘れた人は → ダッシュ速度仕様について ar1886595 )
速度は加速減速しないフレームというものがありました。
地上で右キーを複数フレーム押した時の速度パターンを書き出したいと思います。

右キーを1フレーム押した場合、速度(spx(x))の変動は2パターンになります。
 0→1→0 (合計1spx(x)進む)
 0→0→0 (合計0spx(x)進む)
右キーを2フレーム押した場合、速度(spx(x))の変動は5パターンになります。
 0→1→2→1→0→0 (合計4spx(x)進む)
 0→1→2→1→1→0 (合計5spx(x)進む)
 0→1→2→2→1→0 (合計6spx(x)進む)
 0→1→1→0→0→0 (合計2spx(x)進む)
 0→0→1→0→0→0 (合計1spx(x)進む)
右キーを3フレーム押した場合、速度(spx(x))の変動は7パターンになります。
 0→1→2→3→2→1→0→0 (合計9spx(x)進む)
 0→1→2→3→2→1→1→0 (合計10spx(x)進む)
 0→1→2→3→2→2→1→0 (合計11spx(x)進む)
 0→1→2→3→3→2→1→0 (合計12spx(x)進む)
 0→1→2→2→1→0→0→0 (合計6spx(x)進む)
 0→1→1→2→1→0→0→0 (合計5spx(x)進む)
 0→0→1→2→1→0→0→0 (合計4spx(x)進む)

右キーを3フレーム以上も押してはspx(x)が変動しすぎて話にならないのが分かります。

例えばspx(x)を0~5の範囲内に調整したいなら、
右キーを2フレーム以下に押して離してを繰り返し
マリオが画面上で1px(x)動くのを確認したら止めることで確実に調整されます。
 例 現在spx(x)=15で右キー2フレーム押すと、
   最小で15+1⇒px(x)=1とspx(x)=0
   最大で15+6⇒px(x)=1とspx(x)=5
   spx(x)が0~5の範囲内に収まる

もっと厳しく、例えばspx(x)を0~1の範囲内に調整したいなら、
可能な限り右キーを1フレーム押して離してを繰り返さなければならない分かります。

右キーを1フレームだけ押すなんて人間にできるのかという問題が浮かびますが
難しいですができなくもありません。頑張ってください。




【オマケ】
他のサブピクセルマニピュレーションをご紹介します。

■スクロール右端めり込みspx(x)マニピュレーション



スクロール面で右端の見えない壁にぐりぐり右キーを入れながらめり込んでいる時、
実はこの状態のspx(x)はspx(x)=0に固定されております。

この仕様を利用したら何か可能性を感じそうです。
残念ながら執筆者は上手い利用方法をまだ見つけられてません。

以下だらだら独り言検討
 スクロール面は最後は土管に入るが最速で入ることができる。
 (正しくは見えない壁めり込みがあるため運が絡む?)
 それはつまりステージ開始から同じフレーム数で土管に入れるので
 土管から出たあとの速度上昇びのパターンも固定される。
 よってそのままゴールすれば固定されたspx(x)を実現できるはず。
 例えば6-7で固定させて6-9で壁を蹴るとか?
 いや100%でP羽ケチる意味ないか・・・
 5-6で固定させて、5-砦2で壁抜け?
 運が絡むうえに、ジャンプ調整も難しいしspx(y)も大事で失敗したら死ぬし最後のあがきの確率アップ用?


■2マス天井spx(y)マニピュレーション



このマニピュレーションは今のところ覚える必要はないです。

ジャンプ速度と天井にぶつかる高さから調整しますが、
ジャンプ速度について詳しくご説明していないのですが軽くご紹介程度にします。
高さ2マスの隙間にデカマリオ状態で入って、
天井に頭をぶつけるように最大ジャンプを繰り返すとspx(y)が以下のように変動します。
 spx(y)=15 ⇒ spx(y)=1(マリオが少し天井にめり込む)
 spx(y)=14 ⇒ spx(y)=0(マリオが少し天井にめり込む)
 spx(y)=13 ⇒ spx(y)=15(マリオが少し天井にめり込む)
 spx(y)=12 ⇒ spx(y)=8
 spx(y)=11 ⇒ spx(y)=7
 spx(y)=10 ⇒ spx(y)=6
 spx(y)=9 ⇒ spx(y)=5
 spx(y)=8 ⇒ spx(y)=4
 spx(y)=7 ⇒ spx(y)=3
 spx(y)=6 ⇒ spx(y)=2
 spx(y)=5 ⇒ spx(y)=1
 spx(y)=4 ⇒ spx(y)=0
 spx(y)=3 ⇒ spx(y)=2
 spx(y)=2 ⇒ spx(y)=1
 spx(y)=1 ⇒ spx(y)=0
 spx(y)=0 ⇒ spx(y)=15
これを見ると、spx(y)=1,0,15でループしているのが分かります。
また他のspx(y)もジャンプを繰り返せばspx(y)=1,0,15に収まることが分かります。

例えばジャンプ2回目以降に天井にめり込んだ時がspx(y)=1となります。
これを利用してできる技があるかもしれません。