うっほー!ゴッリラだよ!
皆調子はどう??おいらは今日も絶好調だよ!!

さて!今回のパートでアステロイドを完成させるよ!
まだパート①,②,③,④をやっていないよ!っていう人は、先にそっちを終わらせてね!
★目次
11. スポーンシステムを追加しよう!
*数秒ごとに自動で隕石がスポーンしているよ!
今のままだと、配置した隕石を破壊しちゃったら何も表示されなくなってしまうから、
一定時間ごとに隕石を自動で追加するシステムを追加していこう!

roomに配置した隕石インスタンスを全部削除しておいてね!
まずは、ゲームが始まった時に自動で隕石がいくつか生成させるようにしよう!
・Room Start Eventを追加しよう!
ゲームオブジェクトのAdd Eventをクリックして、Room Start Eventを追加しよう!

Room Start Eventは、roomが読み込まれたときに実行されるイベントだよ!
以下のコードを追加してね!(Room Start Eventについて詳しくはこちら)
1 2 3 4 5 6 7 8 9 10 11 |
if(room == r_game) { repeat(6) { var xx = choose(irandom_range(0,room_width*0.3),irandom_range(room_width*0.7,room_width)); var yy = choose(irandom_range(0,room_height*0.3),irandom_range(room_height*0.7,room_width)); instance_create_layer(xx,yy,"Instances",o_asteroid); } alarm[1] = 60; } |
いつも通り、上から順に説明していくよ!(*’▽’)
1 2 3 4 |
if(room !=r_game) { exit; } |
ゲーム画面以外で隕石をスポーンさせたくないよね?
だから、最初にroomがゲーム画面かどうか確認していて、それ以外の時はexitを使って
先に進まないようにしているよ!(exitを使うとイベントから抜け出せるんだ!)
1 2 |
//irandom_range()で返されたどちらかの値がxxに代入される var xx = choose(irandom_range(0,room_width*0.3),irandom_range(room_width*0.7,room_width)); |
そのあとchoose()関数を使って、xxにx座標”0~150″または”350~500″の値を代入しているよ!


真ん中にはスポーンしないようにしているんだ!
同様にchoose()関数を使い、yyにy座標”0~150″または”350~500″の値を代入しているよ!

そしてxx,yyの座標に隕石インスタンスを作成しているんだ!
repeat()によってこの処理が6回繰り返された後、Alarm[1]を呼んでいるよ!

次に、一定時間毎に隕石が生成される処理を追加するよ!
・Alarm Eventを追加しよう!
Add Eventをクリック → Alarm Event 1を追加

Alarmの説明は何度もしたので省略するね!
追加出来たら以下のコードを記述しよう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
if(room !=r_game) { exit; } if(choose(0,1) == 0) { var xx = choose(0,room_width); var yy = irandom_range(0,room_height); } else { var xx = irandom_range(0,room_width); var yy = choose(0,room_height); } instance_create_layer(xx,yy,"Instances",o_asteroid); alarm[1] = 4*room_speed; |
どう?Room Create Eventとほとんど同じようなコードだよね?
もう皆問題ないと思うけど、念のために変更点だけ解説するね!
1 2 3 4 5 6 7 8 9 10 11 |
if(choose(0,1) == 0) { var xx = choose(0,room_width); var yy = irandom_range(0,room_height); } else { var xx = irandom_range(0,room_width); var yy = choose(0,room_height); } |
ここではif文の中でchoose関数を呼んでいて、値が0だった時
画面の一番”左端”または”右端”のx座標、そしてランダムなy座標に隕石を生成させているよ!
それ以外の時、つまり値が1だった時は画面の一番”上”または”下”のy座標、
ランダムなx座標に隕石を作成させているんだ!
1 |
alarm[1] = 4*room_speed; |
最後に、ゲームのfpsを管理する組み込み変数room_speedに4を掛けたフレーム後
つまり、4秒後にもう一度このアラームイベントを呼び出しているよ!

これでゲームのシステムは完成だああああ!!!
\( ‘ω’)/キタアアアアアアーーーッ!
あとはBGMや効果音を追加して、ゲームの完成度を上げよう!
12. ゲームの効果音を追加しよう

ゲームに使用する音ファイルを追加しておいたのでダウンロードしてね!
自分で作成したものを使用してもいいよ!(*’▽’)
・効果音を読み込もう!
画面右Resource内Soundを右クリック → Create Soundをクリック

するとこんな画面が表示されるので…

①名前を’a_song’に変更してね!(なんでもいいよ!)
s_にしちゃうとSpriteと被っちゃうので、Audioの略のaにしておいたよ!
②…をクリックして音ファイルを読み込もう!
msc_songというファイルを選択しよう!
▷マークをクリックして音が大きすぎる場合は、Volumeの値を調整してね!
同じ手順でほかのファイルも読み込もう!

・ゲームのBGMを追加しよう!
ゲームオブジェクトのRoom Start Eventを開いてね!
1 2 3 4 5 6 7 8 9 10 11 12 |
if(room == r_game) { //ここに追加しよう! repeat(6) { var xx = choose(irandom_range(0,room_width*0.3),irandom_range(room_width*0.7,room_width)); var yy = choose(irandom_range(0,room_height*0.3),irandom_range(room_height*0.7,room_width)); instance_create_layer(xx,yy,"Instances",o_asteroid); } alarm[1] = 60; } |
if文の後に、以下のコードを追加しよう!
1 2 3 4 5 |
if(audio_is_playing(a_song) { audio_stop_sound(a_song); } audio_play_sound(a_song,2,true); |
*audio_is_playing()指定した音が再生されていたらtrueを返す
*audio_stop_sound()指定した音を停止する
まず既にBGMが再生されているかを確認していて、再生されていたら
一度曲を止めてからもう一度BGMが流れるようにしているんだ!
audio_play_sound()関数は、音,優先度,音の繰り返しを正負で受け取るんだ!
音はさっき作成したサウンド、優先度は一度に再生できる音の数を超えたとき、
どれくらいこの音が重要か表しているんだ!(優先度の値が低いと停止される)
最後の正負は、音が流れ終わった時にループさせるかどうかを表しているよ!

・敗北音/勝利音を追加しよう!
同じく、ゲームオブジェクト内のStep Eventを開いてね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
if(keyboard_check_pressed(vk_enter)) { switch(room) { case r_start: room_goto(r_game); break; case r_gameover: case r_win: game_restart(); break; } } if(room == r_game) { if(score >=1000) { room_goto(r_win); //ここに勝利音を追加してね! } if(lives <=0) { room_goto(r_gameover); //ここに敗北音を追加してね! } } |
プレイヤーのスコアが1000以上に達して勝利画面に移行した後に、
勝利音が鳴るように以下のコードを追加しよう!
1 |
audio_play_sound(a_win,1,false); |
または、プレイヤーのスコアが0以下になってゲームオーバー画面に
移行したときは、敗北音が鳴るようにしよう!
1 |
audio_play_sound(a_lose,1,false); |
・発射音を追加しよう!
プレイヤーのStep Eventを開いてね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
if(keyboard_check(vk_right)) { image_angle -=rotateSpeed; } if(keyboard_check(vk_left)) { image_angle+=rotateSpeed; } if(keyboard_check(vk_up)) { motion_add(image_angle,moveSpeed); } if(keyboard_check_pressed(vk_space)) { //ここに追加しよう! var bullet = instance_create_layer(x,y,"Instances",o_bullet); bullet.direction = image_angle; } move_wrap(true,true,sprite_width); |
プレイヤーがスペースキーを押して弾が発射されたときに、
発射音がなるよう以下のコードを追加しよう!
1 |
audio_play_sound(a_zap,2,false); |
・破壊音を追加しよう!
プレイヤーと隕石のCollision Eventを開いてね!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
lives -=1; //ここに追加してね! with(o_game) { alarm[0] = 60; } instance_destroy(); repeat(10) { instance_create_layer(x,y,"Instances",o_debris); } if(lives <=0) { room_goto(r_gameover); } |
隕石とプレイヤーがぶつかった時、破壊音を鳴らすようにしよう!
1 |
audio_play_sound(a_die,1,false); |
同じように、弾と隕石のCollision Eventを開いて、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
score+=10; //ここに追加してね! instance_destroy(); with(other) { instance_destroy(); if(sprite_index == s_asteroid_l) { repeat(2) { var ast = instance_create_layer(x,y,"Instances",o_asteroid); ast.sprite_index = s_asteroid_m; } } else if(sprite_index ==s_asteroid_m) { repeat(2) { var ast = instance_create_layer(x,y,"Instances",o_asteroid); ast.sprite_index = s_asteroid_s; } } repeat(10) { instance_create_layer(x,y,"Instances",o_debris); } } |
弾と隕石がぶつかった時にも、破壊音を鳴らすようにしよう!
1 |
audio_play_sound(a_hurt,1,false); |
これでゲームは完成だよ!(*‘∀‘)
お疲れ様(*‘∀‘)長いシリーズだったけど、、よく最後までやり切りきったね!!!
まとめ
みんな本当にお疲れ様!更新がかなり空いてしまってごめんね( ;∀;)
今回始めてゲームを作った方!おめでとう(*‘∀‘)!
ついにゲーム開発者としての一歩を踏み出すことができたね!
“え~ 書いてある通りに勧めただけだよ~と思うかもしれないけど、
僕は解説をしているだけで実際に手を動かして、ゲームを完成させてたのはみんなだよ!
だから自信を持ってね!(*’ω’*)
何かエラーや気になることがあればいつでもコメント
または僕にメッセージを送ってね!( ・`ω・´)

次は、簡単なアクションゲームを作るシリーズを始めるから楽しみにしていてね!
それじゃあまた次の記事で会えることを楽しみにしているよ!
ゴッリラさん、はじめまして!
今回のアステロイド講座、非常にわかりやすい説明のおかげでプログラミング初心者の私でもスムーズにゲームを作ることができました!ありがとうございました!次回のアクションゲームシリーズも楽しみにしてます!!
私はゴッリラさんのほかにゴッリラさんがおすすめされているチュートリアルサイトの一つのしゅんさんのサイトを参考に勉強をしているのですが、その中でオブジェクト同士の角度差を算出するための内積を計算する関数など高度な関数がGMLに存在することを知りました。きっとこれらのほかにもまだまだ高度な関数が存在するのだと思います。そこで一つ質問なのですが、ゴッリラさんはこれらの関数群を覚えるためにどのようなことをしたのでしょうか?書籍を買って勉強したのでしょうか?それとも英語がわからなくても海外のチュ-トリアル動画をがむしゃらに勉強すれば自然と身につくものなのでしょうか?
Ganbaruさん、はじめまして! とても嬉しいです!ありがとうございます(*゚▽゚)
正直今でも知らない事のほうが多いのですが、僕はチュートリアルを見たり、こんな関数ないかな?と調べている内に 関数についての知識が身につきました! GameMakerの公式リファレンスに全関数のリストが乗っているので、 それを見て勉強するのも良いと思います! https://docs.yoyogames.com/source/dadiospice/002_reference/index.html 英語が苦手な場合は、こちらの日本語版のサイトが役に立つと思います! https://www.wikihouse.com/GameMaker/index.php?%C1%C8%A4%DF%B9%FE%A4%DF%B4%D8%BF%F4%20%A5%A2%A5%EB%A5%D5%A5%A1%A5%D9%A5%C3%A5%C8%BD%E7
わざわざURLまで乗せていただいてありがとうございます!
これからもゲーム制作の中でふと出た疑問があれば質問させていただきたいと思うのでよろしくお願いします!!
はい!僕の答えられる範囲であれば喜んで、お答えさせていただきます!( ´ ▽ ` )
とても参考になりました!!
online casino best online casinos casino games [url=https://onlinecasinounion.us.com]casino real
money[/url] free casino games