プログラミングでアイワナを作ろう！

#はじめに
この記事は、[SLP KBIT AdventCalendar 2021](https://adventar.org/calendars/6706) の13日目の記事になります。
ゲーム制作を始めたいと思っている方にとって、手助けとなるような記事になれば幸いです。

#目次
>[1. アイワナってなに](#1-アイワナってなに)

>[2. 制作準備](#2-制作準備)

>[3. さあつくろう](#3-さあつくろう)

>[4. 最後に](#4-最後に)

#1. アイワナってなに
ところでみなさんは 「アイワナ」 というゲームシリーズをご存知だろうか。

いわゆる「鬼畜ゲー」が大好きなゲーマーならば知らない人はいないだろう。

>
DLサイト [アイワナまとめ@wiki](https://w.atwiki.jp/iwannabethewiki/pages/2153.html)
ゲーム本体は無料でDLできます。<b>DLの際、広告には十分注意してください。</b>
（DLに関する事柄は自己責任でお願いします。）
どんなゲームなのかより詳しく知りたい方⇩
https://www.youtube.com/watch?v=1uQDktYSZbQ&list=PLRRWMiMx3X0vYEXJpBp4nCTv6dXeep4mN

今回の記事では、このアイワナのオリジナルステージ制作の過程を、簡単に解説していきたいと思います。

#2. 制作準備

ゲーム制作って聞くと誰しも
「難しそう....」
と思いがちですが、アイワナ制作ってのは結構簡単にできるものなんです。（プログラミング初心者の筆者も簡単に作れました）。まずは環境構築からの設定です。

###1. GameMakerのインストール
アイワナ制作においては、この「GameMaker」と呼ばれるゲームエンジンを用いて行われます。

「ゲームエンジン」とは、言わばゲームを作るための（作りやすくするための）アプリケーションです。

「マリオメーカー」という任天堂switchのゲームソフトをご存知ならば、ゲームエンジンの位置づけを想像しやすいでしょう。

（GameMakerのダウンロード方法はここでは割愛させていただきます。[こちらのサイトをご参照ください。](https://sites.google.com/site/iwannaarekore/create/syokyu/setting)）

###2. エンジンのダウンロード
GameMakerをダウンロードして起動しただけではまだ制作はできません。アイワナ制作における「エンジン」というものをダウンロードします。
（この「エンジン」というのは、「ゲームエンジン」と異なるので注意）

「エンジン」というのは、第三者が事前にゲームデータをGameMakerで作成し、そのデータを保存してあるものを指します。

つまり、そのエンジンというのをダウンロードするだけで、あとは自分の好きなブロックやアイテムを自由に配置できるのです。

（自分自身で１からGameMakerでアイワナを作ることも可能ですが、一個一個必要なデータを作り上げるには大変な労力が必要ですからね。アイワナ制作では、このエンジンを用いて行われるのが一般的です。）

エンジンにはたくさんの種類があります。今回はゆううつ様の作成した「yuuutu edition ver 2.17」を使用します。

（エンジンのダウンロード方法はここでは割愛させていただきます。[こちらのサイトをご参照ください。](https://sites.google.com/site/iwannaarekore/create/syokyu/setting)）


#3. さあつくろう
早速ステージを作っていくのですが、今回の記事のタイトルは「プログラミングでアイワナを作ろう！」です。

<b>したがって、ただブロックや針を配置するだけの過程は全カットです！！</b>

ボスまでの道中ステージがこちらになります～
![スクリーンショット (304).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384147/74aeae73-31f1-8cff-2610-17795fa37162.png)
右下のワープブロックに入ると、ボスルームに入れます。（画像ではまだ設置されていません。）

それでは早速コードを記入していきたいと思います。

コードを記入することで、デフォルトでエンジン内に入っていたデータのみだけでなく、より詳しい処理を自分でも付け加えることができちゃうんです。

その代表例として、今から自分オリジナルの ”ボス” を作成していきます。

###1. ボスとして扱う画像データの準備
キャラクターを作るにしろ何にしろ、まずは画像が必要です。GameMaker内では画像の作成も可能なので、そこで作成していきたいと思います。
>
右のメニュータブから
Sprites > Create Sptite > Edit Sprite > File > New...
の順番に指定していきます。そこで高さが指定できますが、今回は
width 400
height 400
としておきましょう。

好きなように作成します。できた画像がこちらです。
![スクリーンショット (305).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384147/83ea14a0-d686-addb-4f14-e2ebd1dc2ec0.png)

余分な場所は切り取って保存です。
>
Transform > Crop > OK
で画像の余分な個所を切り取ってくれます。最後にXでウィンドウを閉じる際、Yesで変更を保存すると完成です。

しかし、このまま配置してもこれはただの画像ファイルですので、自身の操作キャラクターには何の影響もありません。そこで、アタリ判定を作成しましょう。ボスに触れたら死亡するという仕様にします。
>
右のメニュータブから
Objects > Create Object > Spliteに先ほど作成した画像を、ParentでplayerKillerを選択
最後にそのボスのオブジェクトを保存 > 配置

Before
![スクリーンショット (306).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384147/59dc3695-43f9-a978-96ef-a3b377d5cf77.png)
After
![スクリーンショット (307).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384147/1f8e1b38-6c4d-b0fe-ccf0-297edb084357.png)
きちんと当たり判定が生まれていることが分かります。
（作成途中のデータを間違えて消してしまいました。先ほどと画像が異なります。）

###2. ボスの処理を作る
長らくお待たせいたしました。ようやくコードを記述します。
今回作りたいと思っているボスの仕様です。
１．体力が５
２．ランダムな方向に攻撃（リンゴ）を飛ばしてくる
３．攻撃を当てると一定時間無敵（連続攻撃できない）
４．倒すと消滅する

まず、１の体力の作成から始めます。
>
右のメニュータブから
Objects > 先ほど作ったボスのObject > Add Event > Create
続いて左にある
control > Code > Execute Code をAction にドラッグ＆ドロップ
コードには
```hp = 5;```
を記述。

これによって、ボスが画面に生成された瞬間、ボス内にある、先ほど自分で作成した変数hpに5が格納されます。

つぎに２のボスの攻撃の作成に入ります。
>
右メニューのタブから
Objects > Create Object > Spriteにお好きなCherry、ParentにplayerKillerを選択
続いて以下の画像のように設定。
![スクリーンショット (308).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2384147/01b9b296-d9c6-c1ea-69de-3ce7b61517e8.png)

これらの意味としては、「当たり判定を持ったリンゴが生成時に、360度のランダムな方向に２～５のランダムなスピードで飛んでくる」というものになります。
[訂正]
randon -> random

また、生成されたリンゴは画面外に出ると消える、という処理も加えます。（これが無いといつまでもリンゴは画面外に残り続け、動作が重くなります。）
>
Add Event > Other > Outside Room
続いて、左側にある
control > Code > Execute Code をOutside Room にドラッグ＆ドロップ。
コードには
```instance_destroy();```
を記述。

これでリンゴが画面外で消える処理は完了です。

ではこのリンゴをボスから飛ばしていきます。もう一度ボスのオブジェクト編集画面に戻って、
>
Add EventのCreateにあるExecute Codeに
```alarm[0] = 1;```
を追加。
Add Event > Alarm > alarm 0
alarm 0 のActionにExecuteCodeを入れる。
コードには
```repeat(10) {
instance_create("ボスのオブジェクト名".x, "ボスのオブジェクト名".y, "リンゴのオブジェクト名");
}
alarm[0] = 100;```
を記述。

alarmというのは言わば関数に近いものです。ボスの生成時にalarm[0]がstep1という速度（めっちゃ早い）で一度だけ発動します。

alarm[0]には、生成される位置と物（今回はリンゴ）を書きます。位置は予めボスの座標を設定しているので、そこからリンゴが飛んでくるようにします。
そしてこれがリピート文で繰り返されます。リンゴは１０個飛んでくるわけです。
そして、alarm[0] = 100; というのが、alarm[0]がstep100という速度（約２秒後）で発動するという意味です。（つまりこのalarm[0]全体の処理は繰り返されるわけです。）

つぎに、ボスに弾が当たると体力が減っていく処理を書いていきます。
>
Add Event > Collision > player_etc > bullet を選択
bulletの中にExecute Code を入れる。
コードには
```with(other) {
instance_destroy();
}
sound_play(sndBossHit);
hp = hp - 1;```
を記述。

このCollisionは、ある物がある物に衝突した際に起きるイベントを制御できます。

コードの説明をすると、まずボスに弾が当たった際、その弾を消す処理を行います。次に、その時ヒット音が鳴る処理を加えています。最後に、ボスの生成時に作成したhpから１がマイナスされます。

つぎに３のボスの無敵時間を作ります。
>
ボスのCreate > Execute Code に
```muteki = 0;```
を追加。
ボスのCollision > Execute Code 内部を
```with(other) {
instance_destroy();
}
if (muteki == 0) {
sound_play(sndBossHit);
hp = hp - 1;
muteki = 1;
alarm[11] = 150;
}```
に変更。
Add Event > Alarm > alarm11
続いて左から
control > Code > Execute Code をalarm11にドラッグ＆ドロップ
alarm[11]には
```muteki = 0;```
を記述。

説明すると、ボスの生成時に、hpともう一つ新たにmutekiというものが作られるようにしました。mutekiには0が格納されています。

Collisionのコードを読んでいくと
>
弾がボスに衝突した際、もしmutekiが0ならば、ヒット音を鳴らし、hp-1をして、mutekiを1にする。step150（約３秒）後にalarm[11]を発動する。

ということが分かります。

alarm[11]にはmutekiを0に戻す命令が書かれています。

つまり、弾を当てた瞬間、ボスのmutekiは1になり、if文によって、連続攻撃でhpをどんどん減らすことが不可能になるため、これでボスの無敵時間が実現できたわけなのです。

ようやく最後の４、ボスの消滅を作成していきます。最後の仕上げです。
>
ボスのCollision > Execute Code に
```if (hp == 0) {
sound_play(sndDeath);
instance_destroy();
}```
を追加。そしてその前に書いたif(muteki == 0)文は
```if (muteki == 0) {
if (hp > 0) {
    sound_play(sndBossHit);
}
hp = hp - 1;
muteki = 1;
alarm[11] = 150;
}```
に変更。

説明をしますと、ボスのhpが0になった場合、ボスの撃破音とともにボスが消滅します。ボスの撃破音のみ鳴らしたい（ボスのヒット音は撃破時には鳴らない）ので、前に書いたif分の中にif分を加えて実現させています。

以上で全コードの記述は終了です。お疲れさまでした。プログラミングのレベルもかなり低いので、ゲーム制作初心者にとってアイワナ制作はちょうどいいのではないのかと思います。

#4. 最後に
今回は簡単な解説ということで、色々なところを端折って説明しました。おそらくこの記事を読んだだけではすべて理解できないと思います。完全に他人へ丸投げ、という形になってはしまいますが、もし
「まだまだたくさん制作してみたい！！」
と思う方がいらっしゃるなら是非他の人の解説サイトをご覧ください。この記事より丁寧で良い解説を行っていると思います。

ここまで読んで下さり、ありがとうございました。