
Scratchでキャラクターにキー操作を実装するのはとても簡単ですが、逆に動いて欲しくない場面を考えると実はちょっと奥深いものがあります。今回はそういった制限や判定についての話をまとめてみました。うまくいく方法を知りたくて調べてきた方は目次の「オススメの方法」だけ見ればOKです。
移動の実装

まずは移動の実装です。画像はキー入力でキャラクターを動かすためのサンプルになります。
作ったことのない方でもここまではサンプルを見れば簡単そうですね。ここには右に動く機能しかありませんが、これを参考に工夫すれば左右上下にも作れそうですね。
イベントブロックにある「~~キーが押されたとき」を使っても似たような動きは作れますが、動きがぎこちなくなってしまうので個人的にあまりオススメはしていません。
作ったことのない方でもここまではサンプルを見れば簡単そうですね。ここには右に動く機能しかありませんが、これを参考に工夫すれば左右上下にも作れそうですね。
イベントブロックにある「~~キーが押されたとき」を使っても似たような動きは作れますが、動きがぎこちなくなってしまうので個人的にあまりオススメはしていません。
条件を整理する
ここからが本題の当たり判定のお話です。
理想を整理すると「壁に当たるとそれ以上は動けなくなる」という機能が追加できればよさそうです。つまり、「壁にあたっているかどうか」と「キーが押されているか」という2つの条件を使えばできそうですね。
理想を整理すると「壁に当たるとそれ以上は動けなくなる」という機能が追加できればよさそうです。つまり、「壁にあたっているかどうか」と「キーが押されているか」という2つの条件を使えばできそうですね。
やりがちな失敗

条件がしっかり整理できたらあとはブロックを組み合わせるだけ。ですが、上の画像のように作っても実は思い通りの結果にはなりません。
動かしてみるとわかるのですが、壁で止まることはできます。しかし、そこから動くことができません。これは論理的に考える力のある人こそ陥りやすい落とし穴かもしれません。
動かしてみるとわかるのですが、壁で止まることはできます。しかし、そこから動くことができません。これは論理的に考える力のある人こそ陥りやすい落とし穴かもしれません。
失敗の原因

左右上下どのキーを押しても動けなくなってしまう原因は改めて考えてみると単純です。すでに壁にあたってしまっているのです。
そもそも動くための条件に「壁にあたっていないこと」を追加したので、キャラが壁に刺さった状態で止まってしまえば「壁にあたってる」のは当たり前ですね。
そもそも動くための条件に「壁にあたっていないこと」を追加したので、キャラが壁に刺さった状態で止まってしまえば「壁にあたってる」のは当たり前ですね。
どうやって解決する?
この課題を解決するためにはどんな策が考えられるでしょうか。
あたった回数をカウントしてみたり、別のスプライトを周りに配置してあたった方向を割り出してみたり、押されたキーから次に押せるキーを限定してみたり…。
方法は色々とありそうですが、どれもどんどん複雑になっていきそうですね。
あたった回数をカウントしてみたり、別のスプライトを周りに配置してあたった方向を割り出してみたり、押されたキーから次に押せるキーを限定してみたり…。
方法は色々とありそうですが、どれもどんどん複雑になっていきそうですね。
オススメの方法

個人的にオススメなのは動いた分だけ戻す処理を追加する策です。
画像のサンプルでは動いた直後、壁に当たっていればめり込んだ分だけ壁の外に押し戻す処理です。理屈的にもわかりやすく、作るのも簡単かと思います。
画像のサンプルでは動いた直後、壁に当たっていればめり込んだ分だけ壁の外に押し戻す処理です。理屈的にもわかりやすく、作るのも簡単かと思います。
課題点
上で紹介した戻すアイデアは画期的に思える打開策ですが、課題点もあります。
まずキャラクターや壁の形によってはうまく機能しません。トゲトゲしたキャラや曲面の壁では動けなくなってしまったりします。
また、移動スピードによっては不自然な弾かれ方をします。ここで載せたサンプルでは座標を2ずつ変えて動かしていますが、これは少し遅くてじれったい動きです。
そして、回転する壁や動く床など自動的に移動するギミックにはやはり対応しきれません。
まずキャラクターや壁の形によってはうまく機能しません。トゲトゲしたキャラや曲面の壁では動けなくなってしまったりします。
また、移動スピードによっては不自然な弾かれ方をします。ここで載せたサンプルでは座標を2ずつ変えて動かしていますが、これは少し遅くてじれったい動きです。
そして、回転する壁や動く床など自動的に移動するギミックにはやはり対応しきれません。
まとめ
Scratchで簡単に作れる面白いゲームに迷路ゲームがありますが、その多くが「壁に触れてはいけない」タイプです。これはこれで面白いのですが、作ってみたら思ってたのと違うなという感想もよく出ていたので今回このような記事をまとめてみました。
Scratchに元からあるブロックに「端についたら跳ね返る」というものがあるので簡単そうに感じてしまいますが、実は当たり判定や反射はとても奥深いテーマだったりします。
完璧といえる解決策ではありませんが、参考にしていただければ幸いです。
Scratchに元からあるブロックに「端についたら跳ね返る」というものがあるので簡単そうに感じてしまいますが、実は当たり判定や反射はとても奥深いテーマだったりします。
完璧といえる解決策ではありませんが、参考にしていただければ幸いです。