【GameMaker Studio2】Room間移動の実装方法(GML)

GameMakerバージョン：2.3.1
モデル：見下ろし視点の2Dゲーム

2Dのアクション・RPGゲームを制作する上で、
日本語の資料が見つからず実装に時間がかかった部分をまとめました。

#Room間の移動について
▼Room1
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/33d48e1f-1a5b-33d3-989a-eb060ac9902d.png)
▼Room2
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/a6e43a8f-c599-55c2-fc75-1539920331f2.png)

今回はRoom1とRoom2という2つのRoomを自由に行き来するのが目的です。

![7ab67d1e-a100-4373-aaac-bf8f69dca3ba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/9c272cb0-25c2-e6fd-8290-e6529e8a8d44.png)　Playerオブジェクト
![77ef5cac-d83b-4266-bf7d-c7a664c01667.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/52343698-50fb-db2d-e2c2-c701d7d0ffa0.png)　Step1オブジェクト
![157a84a4-b626-4316-97ff-00bde4907c29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/36afd7fc-0d60-0b88-78c7-a1d7860448b5.png)　Step2オブジェクト

自由に動かせるプレイヤー(Player)と階段のオブジェクト(Step1、Step2)を用意しました。
このプレイヤーが階段に接触することで上下の階を行き来できる、という内容を実装します。
階段以外でも扉やワープポイント等、応用可能です。

#Playerオブジェクト側の設定

まずはPlayerオブジェクトを開き、
Persistentにチェックを入れます。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/7d9cb8dc-d079-7289-924e-18aa15d98342.png)

Playerオブジェクトのイベントを作成します。
Add Event内からOther→Room Startを作成し、以下のコードを記述します。

```js:RoomStartイベント
x = player_x;
y = player_y;
```

次にCollisionイベントを作成します。
Collision→Objects→Step1を選択し、
プレイヤーが階段に接触した際にRoomを移動するためのコードを記述します。


```js:Step1イベント
player_x = other.target_x;
player_y = other.target_y;
room_goto(other.targetRoom);
```

同様にStep2とのCollisionイベントも作成し、以下のコードを記述します。

```js:Step2イベント
player_x = other.target_x;
player_y = other.target_y;
room_goto(other.targetRoom);
```

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/d6540aca-406e-eccc-7a50-1a3c2fcdcbeb.png)

これでPlayerオブジェクト側の設定は完了です。
Stepイベントが作成されていますが、
プレイヤーを動かすためのコードが書かれているだけです。
本記事では使用しないため、無視して大丈夫です。

#Sprite無しのオブジェクトを作成

空のオブジェクトを一つ作成します。
ゲームの裏側で動作するオブジェクトになるため、Spriteは設定しません。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/43fbeb26-f990-5529-108a-670f8b2dd02a.png)

名前はなんでも大丈夫です。今回はSystemオブジェクトとしました。
このSystemオブジェクトのイベントを作成します。
Other内のGameStartイベントを作成し、以下のコードを記述します。

```js:GameStartイベント
Player.player_x = Player.xstart;
Player.player_y = Player.ystart;
```

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/f252302f-3ce5-2d14-554b-3ead0d266dfc.png)

作成したSystemオブジェクトをRoom1の適当な場所に設置します。


#階段の設置

この段階で階段のオブジェクト(Step1、Step2)は空のオブジェクトです。
階段のSpriteが設定されているのみで、イベントは何もない状態ですが問題ありません。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/8502e8a4-8118-6976-47e1-d723f4dd9556.png)
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/0cbdb0ad-bed1-74a6-7b5d-6a30991ae3a7.png)

最初に作成した階段オブジェクトをRoomに設置します。
Room1には地下に降りる階段(Step1)、
Room2には地上に出る階段(Step2)をそれぞれ設置し、
この2つのRoom間を移動できるようにします。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/6cc8b27d-7e35-be07-5f65-c17954bc79f8.png)

まずはRoom1を開き、設置したStep1のインスタンスをダブルクリックします。
Creation Codeを開き、以下のコードを記述します。

```js:CreationCode
targetRoom = Room2;
target_x = 890;
target_y = 540;
```

Room2を開き、同じようにStep2のインスタンスをダブルクリック、
Creation Codeで以下のコードを記述します。

```js:CreationCode
targetRoom = Room1;
target_x = 635;
target_y = 380;
```

![1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869275/4ecedc42-444e-3ec4-7530-0406d6f3eb46.gif)

Playerオブジェクトを設置してRunを実行すると、
プレイヤーが階段に接触した際にRoom移動ができていることが分かります。