カテゴリー

GameMakerStudioを用いたゲーム制作講座その2 「原住民を開発」

今回は原住民が動くように開発するで。GameMakerStudioではオブジェクトの挙動の設定に「GameMakerLangage」(以下GML)を使うんや。所謂プログラミング言語なわけやけど非常に簡単なものやから安心してええで。

原住民が右上に向かって移動するように

まず、前回作った原住民オブジェクトを開いてAdd Event(①)をクリックする。すると色々なイベントが出てくるからここではCreate(②)を選ぶんや。このCreateと言うのは原住民が生まれた時、つまりゲームが始まった瞬間に実行されるイベントや。その後、GMLで挙動を設定するためにcontrolタブ(③)からExecute Code(④)を⑤の領域にドラッグ&ドロップするんや。すると新しいタブが現れる。

そこで画像のように文字を打つ。「speed」「direction」はそれぞれ「速度」「角度」という意味や。速度はそのまま、原住民の速度を示していて、大きければ大きいほど速くなる。角度は右向きを0度として、反時計回りに増えていく。つまり上は90度、左は180度、下は270度や。そしてここで指定した45度は右上という事になる。ここまで入力したら前回と同じやり方で実行してみるんや。上手く行けば前回配置した原住民が右上に向かって移動するはず・・・

ここで一つ注意点。GMLを記述する時は基本的に全角文字を使ってはアカン。全角スペースも×や。この決まりを破ると上画像の矢印で囲った部分に「ERROR at line ○ pos ○: Unexpected symbol.」とエラーメッセージが出る。当然実行時にもエラーが出る。GMLを記述するときには一部の場合を除いて全角入力を使わないことや。

原住民がランダムな角度に動くようにする

ここで一つ問題や。原住民の動く角度をランダムにするには「speed」と「direction」のどちらの設定を変えたらええやろうか。正解は「direction」や。この値を0~360の中からランダムに設定すればええ。そしてそれを実現する方法は驚くほど簡単や。

「direction=」の後を画像のように書き換えるんや。「random(x)」というのは0以上x以下の数を自動で一つ選んでくれる「関数」や。Excelに詳しい人にはとても馴染み深いものやと思う。注意したいのは、やはり全角文字を使わないこと、そして()の中に数字を入れ忘れないことや。後者の間違いを犯した場合、「ERROR at line ○ pos ○: Wrong number arguments to function or script.」というエラーメッセージが下部に出てくる。

再び実行してみてランダムな角度(ワイの場合は右下やった)に移動してくれれば成功・・・と言いたいところやけど実は目に見えにくい問題点がある。実行を繰り返してみて欲しい。原住民が毎回同じ角度に移動してしまうはずや。何とも恐ろしいことに、先程記述した「random(360)」は0~360の数をランダムに返すように見えて実際には「289.34→346.6→91.79→233.07→315.64…」という順番で数を返すだけの似非ランダムやったんや。

似非ランダムをランダムに

これを解決する方法は簡単や。「random(x)」関数を使う前に「randomize()」という関数を使えばええ。つまり「random(x)」よりも上に「randomize()」を記述するんや。(GMLは上から下に実行していくからな)この関数ではかっこの中に数を入れないでええ。(逆に入れてしまうとエラーが出る)関数によってかっこ内に数を入れるか入れないかが決まっているんや。これによって、実行の度に違った角度へ原住民が動くはずや。

原住民を閉じ込める壁を作る

現時点では原住民がすぐに画面外へ行ってしまう。そこで、四方に壁を作って原住民を閉じ込めることにするで。まず、新しいスプライト「spr_wall」とオブジェクト「obj_wall」を作る。この時「spr_wall」のサイズは32×32で、画像は黒く塗りつぶして作成するのが楽や。やり方が分からないって人は前回の講座で原住民のスプライト・オブジェクトを作ったときを参考にするんやで。出来たら壁をルームに配置する。

まず①をクリックして配置するオブジェクトを選択する。(ここでは「obj_wall」を選択)そして画像のように配置するわけやけど、1マス1マス配置するのはちょっと大変や。そこで裏技を紹介するで。配置した壁をクリックすると、②のように四隅に四角形が現れる。その四角形をドラッグするとオブジェクトのサイズが変わる。これを利用すればわずか4つの配置で済むんや。

さて、ここで実行をするとどうなるやろうか。原住民が壁の中だけで動き回るようになるかというとそんなことは無く、壁をすり抜けて画面外へ出ていくのが確認できる。結局設定をしないと思ったような挙動にはならないってことや。

原住民が壁で止まるようにする

まず、原住民が壁をすり抜けないように設定するやで。

最初に、「obj_wall」のsolidのチェックボックス(①)にチェックを入れる。「solid」というのは「固体」という意味で、すり抜けられると困るオブジェクトに付けるんや。ちなみに、「obj_wall」のCreateイベントで「solid=1」と記述してもええで。(solidは0の時OFFで1の時ONなんや)それが済んだら原住民のイベント(②)を追加する。今回はCollisionイベント(③)を追加するんや。このイベントでは原住民が指定したオブジェクトとぶつかった時に何が起きるかを設定できる。クリックした時に画像のように表示されるので、ここでは「obj_wall」を選択する。オブジェクトタブ真ん中のEventsで新たに追加したイベントが選択されていることを確認したら、controlタブ(④)を選びExecute Code(⑤)をドラッグ・アンド・ドロップ。そしたら何かを記述する前に一度実行してみるやで。

(位置等は人によって違うが)こんな風に原住民が壁の所でストップしたら成功や。

今回はここまでや。続きはまた気が向いたら書くで。
この記事で分からない所とかあったらコメントしてってや。

0