RiG++アドベントカレンダー12日目を担当するさだです。
知能科でも使用するGameMakerの事について話そうと思います。
GameMakerとは
2Dゲー特化のゲーム制作ツールです。2Dならほぼ何でもできます。(3Dも一応できるそうです)有名なところではアイワナとかがこれで作られています。
立家の時もこれを使っています。
紹介はこれくらいにして使い方の説明に入ります。
今回は某赤い帽子被ったおっさんゲーみたいなものを作りたいと思います。
(インストールの説明はさすがに省きます。意外とめんどくさかったりする。特にライセンス関連が……)
GameMakerStudioを使用します。

起動したらこんな画面になると思います。
まずはおっさん()を作りたいと思います。
Sprite作成
左上にあるSpritesと書いてあるところを右クリックします。
するとこんなのが出てくるので一番上のCreate Sprite をクリックします。

出てきたウィンドウのEdit Sprite をクリックします。

するとまたウィンドウが出てくるので左上の白紙のマークをクリックします。

これもOKをクリック。

すると透明な奴が出てくるのでそれをダブルクリックします。

するとなんかちっちゃな奴が出てくるので拡大して……。

おっさん(棒人間)を書きます。
そして右上のチェックマーク的なのを押していきます。

すべて押すとこの画面に戻ります。(画像は使いまわしです)
この調子でブロックを書きましょう。

Object作成・Room作成
まずおっさんのObjectを作ります。

例のごとくObjectのところを右クリックからCreateします。
またウィンドウが出てきます。
まず左のほうのSpriteと書いているところをクリックして描いたおっさんを選択してください。
とりあえずおっさんを左右に動かすようにします。
真ん中らへんのAdd Eventをクリックします。
Eventは例えばCreateだと
このObjectが出現したときに一回だけそこに配置したAction(後で説明する)を実行するという意味です。
まあシャドバでいうファンファーレみたいな(UnityでいうStart関数みたいな)もんです。

こんなのが出てくるので下のKeyboardをクリックします。
Keyboardはキーボードの指定されたKeyが押されている間Actionが実行され続けるという意味です。

とりあえず<Left>をクリックします。

左を押したら左に行くようにします。
それにはActionのこれを使います。
こいつは指定した座標をObjectの座標に代入するという処理です。

これをD&DでActionsと書いてあるところの下の空いてるところに放り込みます。

するとこんなのが出てきます。
下のほうにあるRelativeというのはC言語でいう+=や-=みたいな意味です。
日本語でいうと相対的にみたいな意味です。
例えばxに5、Relativeにチェックを入れると実行されるごとに座標に5を足し続けるという意味になります(自分の座標を自分の+5の位置に更新し続ける)。

GameMakerでの座標はこんな感じになっているのでさっきの場合は右に行くことになります。
それでは、左に行くようにするには?
5を-5にすればいいのです。

そして同じように十字キー右を押した場合も作ってください。
つぎに重力をつけます。
その前にblockのObjectをつくります。
その時solidにチェックを入れてください。タグみたいなもんです。

OKをクリックしておっさんをダブルクリックしておっさんのObjectの画面に移ってください。
そして重力を設定します。EventはStepです。
UnityでいうUpdate関数です。

重力はおっさんの下にブロック(solid属性がついたObject)がなかったら下向きに加速度を加える、あったら加速度を0にするという処理を実装すればいいのです。
まず下にブロックがあったら○○をするというActionを配置します。

コントロールタブのこれです。
コントロールタブにある角が丸まってるやつはIF文みたいな働きをします。

この設定で下にsolidがあるかどうかがわかります。
これの下に重力を設定するmoveタブのこれをD&Dします。

設定はこんな感じです。

角度は単位円を想像してみてください。
(0が右90が上180が左270が下)

これで自分の座標より1下の座標にsolidがあれば下向きの加速度を0にするという処理になります。
つぎに下に何もないならという処理を実装するのですがControlタブにelseがありますね?これを使います。
先ほどと同じようにして下向きの重力を設定してください。

するとこうなります。
これで重力は設定できましたがまだこれではブロックを通過してしまいます。
(加速度を0にしただけではまだ等速直線運動し続ける)
ブロックに接地するという処理が必要です。
接地するにはブロックに当たった時下向き無限範囲内のブロックに密着し、上下の速度を0にするという処理が必要です。(加速度0→ブロックにくっつく→速度0)
衝突判定のEventはCollisionです。
意味はまんまです。当たってるときにActionを実行します。
まず判定の相手を選びます。

下向き無限範囲内の壁に密着というActionはこれです。

設定はこんな感じです。(-1で無限という意味になります)

上下の速度を0にするという処理に使うのはこれです。

設定はこんな感じです。

これでブロックの上を移動できるようになりました。
せっかく重力を実装したんだしジャンプしたい?
Eventでスペースキーなどを設定して上向きに適当に速度を与えればジャンプしてくれます。
設定の例はこちらです。


- Room
RoomはUnityでいうSean的な奴です。ここにObjectを配置します。

左のほうのRoomを右クリックしてCreate Roomを選択してください。
するとこんなのが出てくるのでObjectをクリックしてください。


こんな画面になるのでおっさんやブロックを配置してみてください。
配置するものは左のほうの枠をクリックするとかえられます。
Shift + Ctrl を押しながらマウスをクリックし続けると連続して配置してくれます。
消したいときは右クリックからdeleteを選んでください
- 実行
ゲームを実行するにはF5を押してください。

とりあえずこれで左右に動けてジャンプができる(だけの)おっさんゲーができました。
(この状態ではいろいろと不具合があります。ブロックの下からジャンプして当たった時やブロックの横から当たった時など。)
このようにUnityならスクリプトを書いて頑張らなきゃならないのがGameMakerならActionを配置して値の設定をするだけで作れます。
みなさんも使ってみませんか???
おまけ
GameMakerでもスクリプトを使って書くことができます。
ですがその仕様がかなりやばいです。
たとえば
if a = 0
b = 2
- ;がなくてもコンパイル通ります
- ifに括弧がなくてもコンパイルが通ります
- if ==じゃなく =でもコンパイルが(ry
でもちゃんと書かないと読みにくいので普通はいつも通りに書きましょう。
明日はあっちょ君です。よろしくお願いします。
