今回はGMLを使ってシンプルなミニゲームを作成します。
プロジェクトの作成
プロジェクトを新規作成します。
今回は GML を使うので、GameMaker Language
を選択します。
プロジェクト名は何でも構いません。
敵オブジェクトの作成
敵オブジェクトを作成します。
オブジェクト名は objEnemy
として、スプライトを作成します。
スプライト名は、 sprEnemy
として、Import
ボタンをクリックして、以下の画像をインポートします。
(右クリックで "名前をつけて保存" で "tako.png" として保存する)
画像を設定したら、objEnemy
に戻って、Add Event
をクリックして、Create
イベントを作成します。
スクリプトには以下を記述します。
hspeed = random_range(-10, 10);
vspeed = random_range(-10, 10);
このスクリプトは hspeed
/ vspeed
それぞれに -10〜10 のランダムな値を設定します。
これによりランダムな方向に移動するようになります。
敵オブジェクトをルームに配置する
場所はどこに置いても問題ありません。
では、実行して動作を確認します。
実行すると、たこ焼きが移動して画面外に出て行ってしまいます。
たこ焼きを画面外に出ないようにする
たこ焼きが画面外に出ないようにします。
objEnemy
を開いて、Step
イベントを作成します。
スクリプトは以下のように記述します
if(x < 0) {
// 左側に衝突
x = 0;
hspeed = -hspeed;
}
if(y < 0) {
// 上に衝突
y = 0;
vspeed = -vspeed;
}
if(x > room_width) { // room_width はルームの幅
// 右側に衝突
x = room_width;
hspeed = -hspeed;
}
if(y > room_height) { // room_height はルームの高さ
// 下の衝突
y = room_height;
vspeed = -vspeed;
}
それぞれ画面の端まで移動したら、移動量を反転させることで跳ね返り移動を実装しています。
GameMakerの座標系では、左上が (x, y) = (0, 0)
となっており、右端がルームの幅である room_width
下側がルームの高さである room_height
を使って画面端に移動したかどうかを判定しています。
実行して動作を確認すると、たこ焼きが画面端でバウンドするようになりました。
ただ、右と下の跳ね返りが少しおかしな動きをしています。
この原因は sprEnemy
の原点(基準となる座標) が左上となっているためです。
sprEnemy
を開いてみると、Origin
の値が 0 x 0
となっていて、左上が原点になっていることが確認できます。
右側や下側のぶつかりを正しい見た目になるように修正します。
objEnemy
の Step
イベントに記述したスクリプトを以下のように修正します。
if(x < 0) {
// 左側に衝突
x = 0;
hspeed = -hspeed;
}
if(y < 0) {
// 上に衝突
y = 0;
vspeed = -vspeed;
}
if(x > room_width-sprite_width) { // room_width はルームの幅
// 右側に衝突
x = room_width-sprite_width;
hspeed = -hspeed;
}
if(y > room_height-sprite_height) { // room_height はルームの高さ
// 下の衝突
y = room_height-sprite_height;
vspeed = -vspeed;
}
右側を sprite_width
下側を sprite_height
ずらしています。
sprite_width
はスプライトの横幅、sprite_height
はスプライトの高さとなります。
実行して正しく右側と下側で跳ね返るのを確認します。
たこ焼きをクリックすると消すようにする
たこ焼きをクリックすると消えるようにします。
objEnemy
を開いて、Add Event > Mouse > Left Pressed
イベントを作成します。
スクリプトは以下のように入力します。
instance_destroy();
実行すると、マウスクリックでたこ焼きが消えるようになります。
消えるエフェクトを入れます。
objEnemy
を開いて、Add Event > Destroy
イベントを作成します。
スクリプトは以下のように記述します。
effect_create_above(ef_explosion, x, y, 1, c_white);
実行してたこ焼きをクリックするとエフェクトが発生しますが、少しズレが起きています。
これは、たこ焼きの原点が左上なので、左上中心にエフェクトが発生しているためとなります。
これを修正するには、たこ焼きの幅の半分の位置、高さの半分の位置にエフェクトの発生位置をずらす必要があります。
objEnemy
の Destroy
イベントを開いてスクリプトを以下のように修正します。
effect_create_above(ef_explosion, x+sprite_width/2, y+sprite_height/2, 1, c_white);
実行すると正しい位置にエフェクトが発生するようになります。
ゲームクリア判定を実装する
最後にゲームクリア判定を実装します。
オブジェクトを作成し、名前を objGame
とします。
続けて、Add Event > Step > Step
イベントを作成します。
スクリプトは以下のように記述します。
if(instance_exists(objEnemy) == false) {
show_message("GAME CLEAR");
game_end(); // ゲーム終了
}
これは、objEnemy(たこ焼き)が全て消滅したら、”GAME CLEAR” というメッセージダイアログを表示した後、ゲームを終了させる記述となります。
objGameをルームに配置したら、実行して動作を確認します。
たこ焼きを全部クリックすると、”GAME CLEAR” というダイアログが表示されゲームが終了します。