8.新しいカスタムブロックを作ってみよう5
次は亀の甲羅などスプライトをぶつけたときに反応するブロックを作ってみましょう。
ブロックにオブジェクトと反応するスプライトが触れた場合、Xレジスタにスプライトのインデックス番号が格納されます。
次に座標についてですが、マリオやマント、ファイアボールで動作する場合は
RAMアドレスの$9A、$98にブロックの座標が格納されていました。
しかしながらスプライトと反応する場合はアドレスが異なります。
ブロックのx座標は$0Aから2バイトに、y座標は$0Cから2バイトに格納されます。
この座標はスプライトの位置座標と移動方向から計算されるので、やはりズレが生じます。
また、スプライトの移動方向は$0Fに格納されます。
$0Fの値
$00 ブロックに左から触れた場合
$01 ブロックに右から触れた場合
$02 ブロックに上から触れた場合
$03 ブロックに下から触れた場合
それでは、スプライトを下か横からぶつけたときに壊れるブロックを作ってみましょう。
ブロックの処理の流れは以下の通りになります。
1.マリオがチビじゃないかチェック
2.触れたスプライトが投げられてる状態かチェック
3.上からぶつかったときは反応しない
4.スプライトがオブジェクトをすり抜ける設定になってないかチェック
5.ブロックをブランクタイルに変更し、同じ座標にブロックの破片スプライトを生成
ブロックのソースは以下の通りです。
青の箇所では、スプライトの状態をチェックしています。
スプライトが上下から触れた場合は、
スプライトが投げられてる状態でのみ処理が行われるようにしてます。
また左右から触れた場合は、蹴られてる状態でのみ処理が行われるようにしてます。
茶色の箇所では、スプライトが上下から触れたとき、
そのスプライトが上から触れたとき、
すなわち$0Fの値が02の時に終了するようにしてます。
緑の箇所では、スプライトのtweaker5をチェックしてます。
オブジェクトに反応しないスプライトの場合、元々このブロックの処理は実行されません。
しかしながら、Weird ground behaivor 4にチェックが入ってる場合、
オブジェクトを通過しながらもオブジェクトに反応する設定となります。
この場合に処理を実行しないようにしてます。
スプライトが触れた場合、$9A、$98にはブロックの座標は格納されません。
代わりに$0A、$0Cに格納されるので、紫の箇所でこれらの値を$9A、$98コピーしてます。
ピンクの箇所で座標の正規化を行ってます。
行わないと、ブロックの破片の出現位置が少しおかしくなります。
赤の箇所でブロックをブランクタイルに変化させ、
オレンジの箇所で破片スプライトを生成してます。