GameMakerStudioを用いたゲーム制作講座その3 「跳ねる原住民」

前回の講座で原住民が壁の所で止まるようになった。しかしこれではクリックし放題、殺し放題や。いくら原住民を殺すことが目的のゲームとは言え、これではあまりにつまらない。せやから壁にぶつかった原住民には跳ね返ってもらうやで。

跳ね返るとはどういうことか

跳ね返ると口で言うのは簡単やけど、それをゲーム上で実装するためにはちょっとした物理の知識が必要になるんや。と言っても小学生でも理解できるような簡単な事やで。

まず、この画像のように原住民が右側にある壁にぶつかったとする。この時、速度を吹き出しの中のように右方向と下方向に分解して考えると、下方向への速度はそのまま、右方向への速度は逆向き(言い換えると-1倍)になるんや。左側にある壁で跳ね返った場合は下方向への速度はそのまま、左方向への速度は-1倍となるし、上下にある壁の場合は左右方向への速度はそのまま、上下方向への速度は-1倍となる。つまり、跳ね返りの処理をする為に必要なことは「原住民の左右方向への速度・上下方向への速度の変更」と「ぶつかった壁が左右にあるか上下にあるかを調べること」の2つということになる。そしてそのどちらもGMLで簡単に実現できるやで。

if文

まず、「原住民の左右・上下方向への速度」を教えるやで。それぞれ「hspeed」「vspeed」や。hは「horizontal(水平の)」、vは「vertical(垂直の)」の頭文字で、hspeedは分解した速度が右向きの時正の数で左向きの時負の数、vspeedは下向きの時正で上向きの時負になるやで。例えば原住民のhspeedが1、vspeedが-3の時、原住民は毎フレーム右に1、上に3移動するんや。

続いて「壁が左右にあるか上下にあるか」やけど、早速hspeed、vspeedが役に立つ。原住民が壁にぶつかると前回設定したCollisionイベントが呼ばれると同時に、壁(solidのオブジェクト)に原住民がめり込まないように押し出される。結果原住民が進もうとしても押し出され続けるので前回は原住民が壁の部分で止まったように見えたんや。もし原住民がその位置から右向きにhspeed、下向きにvspeed(負の場合は逆向き)進むと、また原住民は壁にぶつかる。一方で、右向きにhspeed進むだけならば、上下にある壁にはぶつからない。下にvspeed進むだけならば、左右にある壁にはぶつからない。このことを利用して壁の位置を調べるんや。

やりたい事がはっきりした所で、原住民のCollisionイベントにこのように記述して欲しい。

まず「place_free(x,y)」というのは関数や。この関数はかっこの中に2つ入れる必要があり、「,」で区切られている。「x」「y」というのは現在の原住民の位置で、xが大きいと原住民は右側に(小さいと左側に)、yが大きいと原住民は下側に(小さいと上側に)いるということになる。そして「x+hspeed」「y+vspeed」はそれぞれ、現在位置から右にhspeedだけ進んだ時のx、現在位置から下にvspeedだけ進んだ時のyを示している。でもってこの「place_free(x,y)」は、原住民がかっこ内のx,yの位置にいる時にsolidのオブジェクト(前回作ったobj_wall)にぶつかるなら0を、ぶつからないなら1を示す。

そして「if(条件式)」というのはif文や。もし条件式が正しければ、その直後のプログラムを実行する。(正しくなければ実行しない)つまり
「if(place_free(x+hspeed,y)=0)hspeed=-hspeed」というのは、現在位置から右にhspeedだけ進んだ時に壁にぶつかるならばhspeedを-hspeedにする(つまりhspeedを-1倍にする)という意味なんや。同様に2行目の「if(place_free(x,y+vspeed)=0)vspeed=-vspeed」というのは現在位置から下にvspeedだけ進んだ時に壁にぶつかるならvspeedを-vspeedにするという意味になる。ちなみに、画像では「hspeed = -hspeed」というように半角スペースが途中に入っているけど、特に意味は無いから入れる必要無いで。

入力したら実行してみるんや。原住民が壁の所で跳ね返るようになったはず・・・

今回はここまでや。続きは例によって気が向いたら書く。

今回の内容は今までに比べ難解で読んでいて辛かったと思う。でも、この「壁で跳ね返る」処理は非常によく使う処理やから是非時間を掛けて理解して欲しい。もし理解できない所があったらコメントで質問するんやで。