うっほー!ゴッリラだよ!
皆、おひさしぶり! テスト期間でしばらく活動できていなかったけど、今日から復活するよ!



おいら、バナナは好きだよ!!! だ、だってゴリラだもん(;゚;Д;゚;)
さ、さて!今回はアステロイド風ゲームの続きを作っていくよ!!
まだ、パート①、②をやっていないよ!っていう人は、先にそっちを終わらせてね!
★目次
4. プレイヤーが打つ弾を作ろう!
前回は、敵である隕石オブジェクトを作成したよ!
このパート③では、プレイヤーが隕石を攻撃できる機能を実装していこう!

・弾のSpriteを作成しよう!
実は、GameMakerStudioは元々、グラフィックス作成ツールだったんだ!
その名残から、Spriteを描写できる機能が備わっているよ!
今回はGMSのグラフィックス機能を使って、弾のSpriteを描いてみよう!
まずは、隕石の時と同じ手順で新しいSpriteを作成しよう!
画面右Resrouce内のSpriteを右クリック → Create Sprite

①Sprite名を変更しよう!
自分で分かるなら、どんな名前でもいいよ!(おすすめはs_bullet)
②Size:下の四方向矢印アイコンをクリックしよう!

ここでは、Spriteのサイズを変更することができるんだ!Width、Heightの値を1に変更してね!
③Edit Imageをクリックしよう

すると、Spriteを描いたり、編集することのできるImage Editorが開かれるよ!
1,ペンツールを選択しよう
これは、絵を描きたい時に使用するんだ!上のBrashesでサイズを設定できるよ!
2,色を選択しよう!
プレイヤーの発射する弾の色を選ぼう!(おすすめは白色)
3,枠内を塗りつぶそう
ここがSpriteを描く場所なんだ!今回サイズを1×1に設定したから一色しか塗れないよ!
Image Editorについては、また別の記事で詳しく解説する予定だから、
今はGMS上でSpriteを編集出来るということを覚えていてね!
・弾丸オブジェクトを作成
Spriteはこれで完成だよ!次に弾丸オブジェクトを作成していこう!
画面右Resource内のObjectを右クリック → Create Objectを選択

①オブジェクトの名前を変更しよう!
おすすめはo_bulletだよ!
②弾丸オブジェクトのSpriteを設定しよう
・・・をクリックすると選択画面がでてくるので、弾丸のSpriteを選択しよう!
・Create Eventを作成しよう!
③Add Eventをクリックして、Create Eventを追加しよう!
ここでは、弾速であるspeedを宣言するよ!
1 |
speed = 6; |

毎フレーム指定されたピクセル分インスタンスを、directionの方向に動かすよ!
・Collision Eventを追加しよう!
④Add Eventをクリックして、Collision Eventを追加しよう!

今回初登場のColision 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 |
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 |
instance_destory() |
最初のinstance_destory()では、隕石に弾が当たった時インスタンスを消去しているよ!
1 2 3 4 |
with(other) { 省略... } |
本来、オブジェクト外のインスタンス変数にアクセスするときは、インスタンス名、idをつける
必要があるけど、withを使うことで、指定したオブジェクトの変数をそのまま呼び出す事が
出来るようになるんだ!
例えば、プレイヤー変数内で弾オブジェクトを削除したい時、そのままinstance_destroy()を
呼び出すとプレイヤーを削除してしまうよね?
なので、削除したいオブジェクトを指定する必要があったけど、with構文を使うことによって、
インスタンス変数にそのままアクセスすることが出来るようになるんだ!
1 2 3 4 5 6 7 8 9 |
//本来 instance_destory(); //プレイヤーを削除してしまう instance_destory(o_bullet); //弾インスタンスを削除(指定する必要がある) //with構文 with(o_bullet) { instance_destory(); //弾インタンスを削除 } |
それを踏まえた上で、with内のコードを見ていこう!
1 2 3 4 5 6 7 8 9 10 11 |
with(other) { instance_destory(); if(sprite_index == s_asteroid_l) { repeat(2) { var ast = instance_create_layer(x,y,"Instances",o_asteroid); ast.sprite_index = s_asteroid_m; } }... |
このotherというのは、弾と衝突したインスタンスの事を指しているんだ!

まずは、instance_destroy()を使って隕石をゲームから削除しているよ!
次のif文では、インスタンスのSpriteを確認して、もし大隕石であればif文内の処理を実行
しているんだ!
1 2 3 4 5 6 7 8 |
if(sprite_index == s_asteroid_l) { repeat(2) { var ast = instance_create_layer(x,y,"Instances",o_asteroid); ast.sprite_index = s_asteroid_m; } } |
repeatというのは、{}ないで囲まれたコードを()内の回数実行してくれる構文なんだ!
つまり、ここでは弾が衝突した隕石が大隕石であった場合、中隕石を二つ生成させているんだ!

1 2 3 4 5 6 7 8 |
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; } } |
同様に次のelse if文では、隕石が大隕石でなかった場合、中隕石であるかどうかを確認して、
そうであれば、小隕石を二つ生成しているよ!
Spriteが小隕石の場合は、何の処理も行わないよ!

1 2 3 4 5 |
repeat(10) { instance_create_layer(x,y,"Instances",o_debris); } } |
最後にrepeat構文を使って、破片インスタンス“o_debris”を10個作成しているんだ!
これで、弾が惑星に当たった時のリアル感が増すよ!

これで、弾と惑星の衝突処理は完成だよ!
5. 破片を作ろう!
次に、弾が隕石に当たった時に飛び散る破片を作っていこう!
・破片のSpriteを作成しよう!
弾Spriteを作った時と同じ手順で、破片Spriteを描いてみよう!

Sprite名を”s_debris”、Width、Heightの値を1にして、白色で塗ってね!
やり方が分からなかったら、少し上にスクロールして復習しよう(*’▽’)
・破片オブジェクトを作成しよう!
画面右Resource内のObjectを右クリック → Create Objectを選択

①Sprite名を変更しよう!
自分で分かるならどんな名前でもいいよ!(おすすめはs_debris)
②破片オブジェクトのSpriteを設定しよう
・・・をクリックすると選択画面がでてくるので、破片のSpriteを選択しよう
・Create Eventを追加しよう
③Add Eventをクリックして、Create Eventを追加しよう!
それができたら、以下のコードを記述してね!
1 2 |
direction = irandom_range(0,359); speed = 1; |
惑星とまったく同じコードなので、説明は省略させてもらうね!

ここでは、irandom_range関数を使って、破片の進行方向をランダムに設定した後に、破片の移動速度である
speedを1に設定しているんだ!
・Step Eventを追加しよう!
④Add Eventをクリックして、Step Eventを追加しよう!
ここでは、破片が発生した後徐々にフェードアウトする処理を追加するよ!
Step Eventには、以下のコードを記述してね!
1 2 3 4 5 6 |
image_alpha-=.01; if(image_alpha <=0) { instance_destroy(); } |
image_alphaは、Spriteの透明度を管理する組み込み変数だよ!
値が1から0に近づくほど、徐々に透明度が高くなるんだ!(0で不透明)

ここでは、毎フレームimage_alphaの値を-0.1ずつ引いているんだ!
そして、image_alphaの値が0以下になった時、ゲームから削除しているよ!
6. 射撃機能を実装しよう!
これで準備は整った!(・`ω・)

最後に、プレイヤーがSPACEキーを押したとき、弾が発射される機能を追加していこう!

・プレイヤーのStep Eventを開こう!
パート①で、プレイヤーのStepEventに以下のコードを記述したよ!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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); } move_wrap(true,true,sprite_width); |
最後のmove_wrap関数の前にこのコードを追加しよう!
1 2 3 4 5 |
if(keyboard_check_pressed(vk_space)) { var bullet = instance_create_layer(x,y,"Instances",o_bullet); bullet.direction = image_angle; } |
ここでは、スペースキーが押されたときに、弾インスタンスを作成して
bulletという変数にインスタンスのidを代入しているよ!

出来るようになるんだ!詳しいことはオブジェクトの記事で解説しているよ!
その後に、作成した弾の進行方向をプレイヤーの向きを管理する、
image_angleの値に設定しているんだ!
弾オブジェクト内で、既にspeedを宣言したから、弾はプレイヤーの向いている方向に
speedの値進んでいくよ!
・ゲームをテストしてみよう!
これで、プレイヤーが弾を撃てるようになったよ!実際にゲームを実行して
確認してみよう!(*’▽’)
隕石とプレイヤーインスタンスが、画面に配置されているかチェックしてね!

画像のように、スペースキーを押したときに弾が発射され、弾が隕石に当たった時
破片と共に一つサイズの小さい隕石が生成されていたら、成功だよ!
エラーが起きたら、コードに打ち間違いがないか確認してみてね!
質問があればいつでも@hellomanaki、コメントで大歓迎だよ!
まとめ
お疲れ様!これで今回のパートはおしまいだよ!

時間をかけた甲斐があって、かなりゲームぽくなってきたね!!(∩´∀`)∩
次回は、プレイヤーのHP、スコアを追加していく予定だよ!
また更新されるまで、楽しみに待っていてね!
ここで作業を中断する場合は、プロジェクトを保存しておこう!
Control + S または 画面上のFileをクリック → Save Projectを選択


・宣伝
Amazonが提供している、本を朗読で聞くことのできるサービス!
今なら無料体験で12/12までの間、最大3000円分のAmazonポイントを獲得できるよ!
退会も簡単に出来るから、気になったら試してみてね!(*’▽’)
解説本当お疲れ様です!
パート4も待ってます(´・ω・`)ゴリ
こちらこそコメントありがとうございます!
出来るだけ早く投稿できるように頑張ります!(*’▽’)
凄く参考になります。
おかげでメモが一杯になってきました。
ただ、ゴッリラさんが緑枠で話しているところに関して、緑の中に白い文字というのは
見づらいなと思いました。
ここを修正すると更に見やすくなると思ったのでコメントさせていただきました。
応援してます。
そう言っていただけてとても嬉しいです!
ありがとうございます!自分では分からないことなので、コメントとても助かります!何色がよさそうですか?
Sprite_indexはどのような影響与えるものなんですか?
説明していたら申し訳ないです。
かむさんコメントありがとうございます!返信が遅れてしまい申し訳ありません。
Sprite_indexはオブジェクトのスプライト(簡単に言うと絵/画像)を管理している変数です!
なのでsprite_indexに別のspriteを指定するとキャラクターなどの絵が変わります!