【GameMaker:Studio2】ミニゲームを作るチュートリアル (Part.2)

GameMakerStudio2でミニゲームを作るチュートリアルの続きです。
前回→[【GameMaker:Studio2】ミニゲームを作るチュートリアル (Part.1)](https://qiita.com/2dgames_jp/items/f0423c83af53a7ae9aa6)

## 床を作る
たこ焼きが画面外に消えないように床を作ってみます。

ResourcesからObjectsを右クリックして、Create Objectを選びます。
![032.png](https://qiita-image-store.s3.amazonaws.com/0/43772/14032c8e-1ad5-e87e-bf28-cadf73a0e29d.png)
(Workspaceの何もないところを右クリックする方法でも問題ありません)

新しいObjectのウィンドウが表示されたので、Nameを "objWall" に変更して、Spriteの＋アイコンからスプライトを追加します。
![033.png](https://qiita-image-store.s3.amazonaws.com/0/43772/c82de3eb-a13f-4c41-788a-acca2cbd919e.png)

新しいSpriteのウィンドウが表示されたので、Nameを "sprWall" に変更して、「Import」をクリックします。
![034.png](https://qiita-image-store.s3.amazonaws.com/0/43772/df5ff97f-073e-0702-7af9-9ff7130ce506.png)

wall.png を選んで「開く」を選びます。
![035.png](https://qiita-image-store.s3.amazonaws.com/0/43772/bcc64f28-6352-8d24-160c-1ac763f1fca1.png)

Resourcesから Rooms > room0 をダブルクリックして、再び Roomエディタを開きます。
![036.png](https://qiita-image-store.s3.amazonaws.com/0/43772/4ded8aae-342a-605a-b780-dd0395c5f255.png)

objWall を Room内にドラッグ＆ドロップして配置します。
![037.png](https://qiita-image-store.s3.amazonaws.com/0/43772/26d32350-32fa-b650-a2a6-cc52573c899d.png)

これを繰り返して objWall を一番下に並べますが、なかなか面倒です。
そこで、Altを押しながらドラッグすると連続して配置することができます。
![038.png](https://qiita-image-store.s3.amazonaws.com/0/43772/ae4be635-df41-c326-11cb-c50a69df21e9.png)

間違えてはみ出した場合は、選択してDeleteキーで削除したり、Ctrl+Zでやり直したりします。

このようになりました。
![039.png](https://qiita-image-store.s3.amazonaws.com/0/43772/076f7e91-6f82-ad4f-ce46-45c31641fe76.png)

では実行して動作を確認します。(F5キー、または左上の三角ボタン(▷)をクリック)
![028.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f30d95ff-76b1-f067-e83d-b91ff2ca6836.png)

しかし、たこ焼きは壁に当たらずに画面外に出て行ってしまいます。
![040.png](https://qiita-image-store.s3.amazonaws.com/0/43772/ae7655fd-b543-93ad-72a1-5350831c93f9.png)

これは衝突判定が定義されていないためとなります。
衝突判定はイベントで定義します。

## 床との衝突判定を作る
Resources から objTako をダブルクリックするなどして、objTako のエディット画面を表示してください。
![041.png](https://qiita-image-store.s3.amazonaws.com/0/43772/37fead6b-fcc0-fb85-49ae-cc9a28491d6f.png)

Eventsボタンを押して、Events(イベント一覧)を表示し、Add Event > Collision > objWall を選びます。
![042.png](https://qiita-image-store.s3.amazonaws.com/0/43772/dd05fc18-f8a1-e398-626a-b6d2cc78a33d.png)

これは、objWall との衝突判定を定義するイベントとなります。
たぶん、ウィンドウが見切れていると思うので、ウィンドウの上部のバーをダブルクリックしてウィンドウが画面内に入るようにします。
![043.png](https://qiita-image-store.s3.amazonaws.com/0/43772/2203266d-b901-5345-a020-c676672ed10e.png)

Toolboxの下にある検索ウィンドウに "move" と入力します。
すると、Movementという移動に関するアイコンが表示されます。
そこから 「Set Speed」 アクションアイコンを選び…
![044.png](https://qiita-image-store.s3.amazonaws.com/0/43772/ca028059-f6a5-0ced-fc83-ca61546de93c.png)

中央にドラッグ＆ドロップします。
![045.png](https://qiita-image-store.s3.amazonaws.com/0/43772/41fddcfa-d7b1-6735-08da-13c02642983c.png)

すると、Set Speed がイベントに追加されます。
![046.png](https://qiita-image-store.s3.amazonaws.com/0/43772/c1eb60d1-78a3-9a8b-5d35-6a1f4d4f2dd3.png)

初期値の場合、objWall にぶつかったら、速度が 0 になる、という設定になっています。
ひとまずこのまま、F5 (または左上の三角アイコン（▷）) で実行します。
![028.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f30d95ff-76b1-f067-e83d-b91ff2ca6836.png)

実行してたこ焼きが床に接触すると、ズブズブ埋まっていく動きをします。
確かに動きは変わりましたが、不自然ですね…。
![047.png](https://qiita-image-store.s3.amazonaws.com/0/43772/7660834b-b230-6c8f-35b3-b269d00ee02f.png)

これは、objWall がめり込みを許可してしまっているためとなります。
Resources から Objects > objWall をダブルクリックして、objWall のエディタを開きます。
![048.png](https://qiita-image-store.s3.amazonaws.com/0/43772/3091be08-bac2-cba0-483d-8dbe5bbc8aaa.png)

objWall のエディタから、「Solid」の項目にチェックを入れます。
![049.png](https://qiita-image-store.s3.amazonaws.com/0/43772/2421c371-7f84-efb8-5d07-c6937107b3bd.png)

これにより、衝突イベントが発生した場合、自動で押し返しを行いめり込みが起きなくなります。

では、再び実行してみます。
![050.png](https://qiita-image-store.s3.amazonaws.com/0/43772/9e192af3-e90e-d04f-42b9-adc44d6acd6c.png)

ちゃんと床の上で止まるようになりました。

続けてたこ焼きをバウンドさせてみます。
Resources から Objects > objTako をダブルクリックして、objTako のエディタを表示し、
objWall との衝突イベントに定義した 「Set Speed」アクションアイコン の設定値を以下のように修正します。

* Type: Vertical
* Speed: vspeed * -1
* Relative: チェックを入れない

![051.png](https://qiita-image-store.s3.amazonaws.com/0/43772/fe2ad829-2bd1-b765-aa2c-b7f10da93562.png)

これは垂直方向 (Vertical) の速度に対して、-1を掛けることでバウンドの動きを定義したものとなります。
Speed の項目に vspeed という文字がありますが、これはオブジェクトが持つ垂直移動の速度の現在値です。
例えば、vspeedが 10 であれば、この処理を通すことで vspeed の値は -10 となり、逆に移動することになります。

では、実行して動作を確認してみます。
たこ焼きが床でバウンドする動きになったと思います。

ちなみに、実行したまま放置すると、どんどん速度が上がり、画面上部に飛び出してしまいますが、これは床との衝突により失われる速度がまったくないという計算をしているからです。
ですので、例えば先ほどの「Set Speed」アクションアイコンの Speed値を 「vspeed * 0.8」 に修正すると
![052.png](https://qiita-image-store.s3.amazonaws.com/0/43772/f5502397-b4b6-283d-2c2b-e28f4623e12c.png)

速度が 0 に収束していき、しばらく待つと床で停止する挙動となります。（正確には床の近くで少し飛び跳ね続けますが…）

続けて、たこ焼きを横に移動するようにしてみます。
Resources から Objects > objTako をダブルクリックして、objTakoのエディットウィンドウを開きます。
Events から Create をダブルクリックして、Createイベントを表示します。

Toolbox に "random" と入力して、Random カテゴリ内の 「Get Random Number」アクションアイコンを選び…
![053.png](https://qiita-image-store.s3.amazonaws.com/0/43772/430d65a7-c8b0-4052-a5b0-770593a5673c.png)

それを中央にドラッグ＆ドロップします。設定値は以下のように設定します
* Type: Decimal
* Minimum: -10
* Maximum: 10
* Target: hspeed
* Temp: チェックを入れない

![054.png](https://qiita-image-store.s3.amazonaws.com/0/43772/2ba106ba-93eb-0689-0fc9-5e27c44a4fb5.png)

これは、objTakoが持つ設定値「hspeed (水平方向の速度)」に対して、-10～10 の値をランダムで設定する、というものになります。
TypeがDecimalとなっていますが、これは小数点の値も許可するものとなります。

これで実行してみると、たこ焼きが左右に動き出して画面外に出て行ってしまいます。
なので、横の壁を作ることにします。

次回に続く…
→[【GameMaker:Studio2】ミニゲームを作るチュートリアル (Part.3)](https://qiita.com/2dgames_jp/items/6bfad6cda0d5fed4947b)