search
LoginSignup
1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

GameMaker Studio Advent Calendar 2020 Day 17

posted at

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

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

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

Room間の移動について

▼Room1
1.png
▼Room2
2.png

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

7ab67d1e-a100-4373-aaac-bf8f69dca3ba.png Playerオブジェクト
77ef5cac-d83b-4266-bf7d-c7a664c01667.png Step1オブジェクト
157a84a4-b626-4316-97ff-00bde4907c29.png Step2オブジェクト

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

Playerオブジェクト側の設定

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

3.png

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

RoomStartイベント
x = player_x;
y = player_y;

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

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

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

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

5.png

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

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

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

4.png

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

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

6.png

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

階段の設置

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

7.png
8.png

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

9.png

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

CreationCode
targetRoom = Room2;
target_x = 890;
target_y = 540;

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

CreationCode
targetRoom = Room1;
target_x = 635;
target_y = 380;

1.gif

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1
Help us understand the problem. What are the problem?