皆さんこんにちはこんばんは!
最近scratchでゲームを作ったのですが、その際当たり判定というのが非常に奥深く難しい分野だと感じました。そこで当たり判定を行う方法をいくつか紹介しつつ、それぞれのメリットデメリットについて考えをまとめてみます。
具体的なコードも載せているので是非最後まで読んでくださいね!
ゲームを作る際、当たり判定を気にしていますか?そもそも当たり判定とは衝突判定とも言い以下のように定義されています。
衝突判定
衝突判定(しょうとつはんてい、Collision Detection)とは、「2つ以上のオブジェクトの交差を検出する」という計算機科学上の問題であり、具体的には「ある物体が別の物体に当たったか(衝突したか)どうか」を判定するプログラム処理のことを指す。ロボット工学、計算物理学、コンピュータゲーム、コンピュータシミュレーション、計算幾何学など、さまざまなコンピューティング分野で応用されている。
引用:「衝突判定」(2021年3月19日 (金) 17:18 )『ウィキペディア日本語版』。
つまり当たり判定はキャラクターが地面に立ったり、敵に攻撃が当たるなどのイベントをこなすために必要な処理なのです。(これがなかったらほとんどのゲーム作れないかも…)この当たり判定をScratchで再現するには大きく2つの方法があります。
画像にある”~色に触れた”、”~色が…色に触れた”というブロックを使うことで当たり判定を行います。このブロックを使うメリットは、当たったことを色で判断するため当たり判定を行いたいスプライトが複数存在しても色を統一すればすべて一括で処理することができるところにあります。マリオのような2D アクションゲームでは地面とクリボー両方の当たり判定を同時に扱うことができるのです。そのほかにもキャラクターの頭部分のみ別の色にすれば頭だけの当たり判定を作ることができます。つまり自分の好きな場所に当たり判定を作ることができるのです。ただデメリットとして色が縛られてしまうことが挙げられます。当たり判定を行いたいスプライトはすべて同じ色にしなければならないのです。
使う場面
・シンプルなゲームを作りたいとき(色が統一されてる)
・キャラクターに複数の当たり判定を持たせたいとき(ヘッドショットと胴体撃ちのダメージの違いなど)
※個人的にはこっちの方法が好き
こちらはキャラクターがなにに触れたかで判断する方法です。これは色での判断ではないので複雑なデザインのスプライトでも関係なく当たり判定を行えます。その反面当たり判定を行いたいすべてのスプライトに対して同じような操作を行わないといけなかったり、細かな当たり判定の設定を行うことはできません。
使う場面
・複雑なデザインのスプライトを使ったゲーム作り
それぞれのブロックは特徴があるので自分が作りたいものに合わせて使い分けてみてください。
さて、ざっとScratchの当たり判定についてみてきましたがブロックを数個置くだけで実現できるので簡単な印象があります。しかしまだ改善できる余地はあります。複雑なデザインのスプライトの細かい当たり判定を行いたい場合、例えば以下の画像のようにしっぽだけで立つのは不自然だからしっぽの当たり判定を消したいときどうすればいいと思いますか?
正解は当たり判定、ヒットボックスを別に自分で作ることです。多くの市販のゲームはプレイヤーに見えている映像とは別にヒットボックスと呼ばれる当たり判定用の透明なオブジェクトを用意しています。このヒットボックスを目安として当たり判定を行うのです。これをScratchでもやってみましょう!
ヒットボックスが欲しいスプライトを複製して当たり判定をなくしたい箇所を消しゴムで消しましょう。
できたらそのスプライトに画像のようなブロックを追加しましょう。
これだけで完成です!幽霊の効果を100%にすることでヒットボックス用スプライトを透明にし、プレイヤーが見ることのできるスプライトを常に追うようにして実現しています。こうすることで、プレイヤーにはしっぽのあるグリフォンが映し出されているが、実際に当たり判定を行うのはしっぽのないグリフォンといったことができるのです。これと上の方で述べた2つの判定方法を使って自分の思い通りの当たり判定を作ってみてくださいね。
当たり判定はゲームの出来を左右するほど重要な要素です。Scratchでは簡単にできていますがScratch以外では数学の複雑な知識(三角関数とか)でヒットボックスつくってたりします。色々調べてみると面白いので是非やってみてくださいね!
最後まで読んでいただきありがとうございました!
Leave a Comment