ゲームを作っていると、壁を通り抜けないような判定が必要になります。
今回は横移動するゲームで、壁に当たったら通り抜けないようにするプログラムを考えてみます。
Scratchではスプライトが重なった場合の判定しかできません。重なった壁と離れるための仕組みを考える必要があります。
左右移動と当たり判定
以前作った「Scratchでジャンプで敵をよけてゴールするゲームを作る」のプログラムを使って説明していきます。
このゲームの左右移動と当たり判定のプログラムはこちらです。
左右移動と壁の当たり判定は関係の深いプログラムになっています。
赤四角部分が当たり判定、青四角部分が左右移動になっています。
このスプライトは壁に触れたときの動きか、左右に移動する動きのどちらかを行うようになっています。
壁に触れたとき(赤四角)の判定が先にあるので、壁に触れたときの動きが優先して実行されます。
壁に触れていなかったら、左右移動できることになります。
当たり判定
あたり判定部分に注目してみてみます。
まず、壁と判定しているのは土管(グレー)の壁と段差のある床(黄緑)です。
黄緑の床は足で触れている時と横から触れたときで動きを変える必要があります。
足で触れている時は左右に移動できなければいけないので、壁の当たり判定と区別しなければなりません。
そこで、
で判定しています。
白く見えますが薄いグレーが黄緑に触れた場合です。
この白はスプライトの縁取りに使われている色です。
足が地面に触れたときの判定と、横から触れた場合を区別するためにスプライトの足を青く塗りました。
こちらもご覧ください。
壁に当たった場合のプログラムはこちらです。
変数「移動速度」には右に移動中だったか、左に移動中だったかが入っています。
左右移動のプログラムで登録しています。
0より大きい場合は右移動中。
0より小さい場合は左移動中。
としています。
そこで、0より大きい場合(右移動中)に壁に当たったときは、x座標を-1(左に1移動)しています。
壁に重なったら、後ろに下がって壁に触れていない状態にします。
これで、壁に触れていないときの操作ができるようになります。
左移動中の時はその逆です。
左右移動
左右移動のプログラムを解説します。
左右移動のプログラムは簡単です。
足(青白)が地面(黄緑)に触れているか、足(青色)が土管上部(濃いグレー)に触れている時に移動ができるようにします。
ポイントは変数「移動速度」です。
変数「移動速度」に右移動中か左移動中かを判定する値を入れます。
この変数を使って、先ほどの当たり判定とジャンプ中の斜め移動のプログラムを作っています。
最後に
Scratchで壁の当たり判定を作るのは工夫が必要です。
「触れたら」という部品はありますが、実際には「重なった」状態で判定されます。
触れた判定をした後は、触れてない状態に戻してやらないとうまく機能しません。
そこで、どちら方向から触れたかを判定して、元の位置に戻すというプログラムが必要になります。
コメント