LoginSignup
3
3

More than 5 years have passed since last update.

【GameMaker:Studio2】ミニゲームチュートリアル (GML)

Posted at

今回はGMLを使ってシンプルなミニゲームを作成します。

プロジェクトの作成

プロジェクトを新規作成します。
今回は GML を使うので、GameMaker Language を選択します。
001.png

プロジェクト名は何でも構いません。

敵オブジェクトの作成

敵オブジェクトを作成します。
オブジェクト名は objEnemy として、スプライトを作成します。
002.png

スプライト名は、 sprEnemy として、Import ボタンをクリックして、以下の画像をインポートします。
tako.png
(右クリックで "名前をつけて保存" で "tako.png" として保存する)

003.png

画像を設定したら、objEnemy に戻って、Add Event をクリックして、Create イベントを作成します。
004.png

スクリプトには以下を記述します。

Createイベント
hspeed = random_range(-10, 10);
vspeed = random_range(-10, 10);

このスクリプトは hspeed / vspeed それぞれに -10〜10 のランダムな値を設定します。
これによりランダムな方向に移動するようになります。

敵オブジェクトをルームに配置する

room0 を開いて、たこ焼きを配置します。
005.png

場所はどこに置いても問題ありません。

では、実行して動作を確認します。
実行すると、たこ焼きが移動して画面外に出て行ってしまいます。

たこ焼きを画面外に出ないようにする

たこ焼きが画面外に出ないようにします。
objEnemy を開いて、Step イベントを作成します。
006.png

スクリプトは以下のように記述します

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;
}

それぞれ画面の端まで移動したら、移動量を反転させることで跳ね返り移動を実装しています。
007.png

GameMakerの座標系では、左上が (x, y) = (0, 0) となっており、右端がルームの幅である room_width 下側がルームの高さである room_height を使って画面端に移動したかどうかを判定しています。

実行して動作を確認すると、たこ焼きが画面端でバウンドするようになりました。
ただ、右と下の跳ね返りが少しおかしな動きをしています。
この原因は sprEnemy の原点(基準となる座標) が左上となっているためです。
sprEnemy を開いてみると、Origin の値が 0 x 0 となっていて、左上が原点になっていることが確認できます。
008.png

右側や下側のぶつかりを正しい見た目になるように修正します。
objEnemyStep イベントに記述したスクリプトを以下のように修正します。

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 はスプライトの高さとなります。
009.png

実行して正しく右側と下側で跳ね返るのを確認します。

たこ焼きをクリックすると消すようにする

たこ焼きをクリックすると消えるようにします。
objEnemy を開いて、Add Event > Mouse > Left Pressed イベントを作成します。
010.png

スクリプトは以下のように入力します。

LeftPressedイベント
instance_destroy();

実行すると、マウスクリックでたこ焼きが消えるようになります。
消えるエフェクトを入れます。
objEnemy を開いて、Add Event > Destroy イベントを作成します。

Test010_-_GameMaker_Studio_2.png

スクリプトは以下のように記述します。

LeftPressedイベント
effect_create_above(ef_explosion, x, y, 1, c_white);

実行してたこ焼きをクリックするとエフェクトが発生しますが、少しズレが起きています。
これは、たこ焼きの原点が左上なので、左上中心にエフェクトが発生しているためとなります。
名称未設定.png

これを修正するには、たこ焼きの幅の半分の位置、高さの半分の位置にエフェクトの発生位置をずらす必要があります。
名称未設定.png

objEnemyDestroy イベントを開いてスクリプトを以下のように修正します。

Destroyイベント
effect_create_above(ef_explosion, x+sprite_width/2, y+sprite_height/2, 1, c_white);

実行すると正しい位置にエフェクトが発生するようになります。

ゲームクリア判定を実装する

最後にゲームクリア判定を実装します。
オブジェクトを作成し、名前を objGame とします。
020.png

続けて、Add Event > Step > Step イベントを作成します。
021.png

スクリプトは以下のように記述します。

objGame>Stepイベント
if(instance_exists(objEnemy) == false) {
    show_message("GAME CLEAR");
    game_end(); // ゲーム終了
}

これは、objEnemy(たこ焼き)が全て消滅したら、”GAME CLEAR” というメッセージダイアログを表示した後、ゲームを終了させる記述となります。

では、この objGame を room0 に配置します。
022.png

objGameをルームに配置したら、実行して動作を確認します。
たこ焼きを全部クリックすると、”GAME CLEAR” というダイアログが表示されゲームが終了します。
023.png

3
3
0

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
  3. You can use dark theme
What you can do with signing up
3
3