# 何も知らんけどアイワナの耐久ボスを作りたい
この記事は[みす56代 Advent Calendar 2021](https://adventar.org/calendars/6434)の6日目の記事です。ムイカメ!
## はじめる
おはようございます。こんな朝早くに当記事をご覧いただきありがとうございます。56代midi研最弱のなすかです。
突然ですがちょっとした目標があります。
**「自分の書いた曲で 遊びたい/遊ばれたい」**
ポケモンみたいになっちゃいました。遊ぶって表現がアレかもしれないですが、音MADとか音ゲーとかをイメージしています。しかし誰かに遊んでもらうまで到達するには十分な作曲スキルを備えたうえで、ある程度知名度も獲得しなければなりません。僕はどっちも持ち合わせていません。ください。自分でやります。
今回はアイワナの耐久ボスなるものをつくります。基本的にボス戦は自分の攻撃を敵に当ててHPを削るという流れだと思うんですが、アイワナの場合は敵の攻撃を一定時間避け続けるだけのボスも多く登場(する気が)します。I Wanna be the LoveTrapのミクさんとか有名じゃないですか?こういうの。
<img src="https://i.imgur.com/Dof0yWO.jpg" width="500">
これをつくります。
さきに断っておきますがプログラミングはマジでわかりません。スライドのプログラム写すだけで単位きたあの講義が俺をダメにしたんだ。自己責任だろ。はい。しかしそれでも自作アイワナなんて語も聞いたことあるし、もしかしたら手を出しやすいのかも?やるだけやってみます。
(壁にぶつかる音)
とりあえず「アイワナ 作り方」で調べるじゃないですか。だいたいサイトの更新日が2011年から2013年なんですよ。だいたいGame Maker 8.0使ってるんですよ。そうなんです!
<span style="font-size: 140%;">今ってアイワナって流行ってないんですよ!!</span>
<span style="font-size: 160%;">2013年?あいのりとか放送してた時期じゃん!!!</span>
<span style="font-size: 200%;">あいのり2009年!!!???</span>
調子乗りすぎました。さすがにあいのりは世代じゃないです。
## 準備をする
ということでつくります。今回準備するものはこちら。
**・Game Maker Studio 2 (trial licence)**
買いません。ブラックフライデーセールとゲームマーケットのせいで金欠です。実行ファイルこそ出力できないですが、自己満足でやるには申し分ないです。
**・I wanna be the Studio Engine YoYoYo Edition**
いわゆるアイワナのエンジンです。アイワナお馴染みのBGMやグラフィックなどが入っていますし、ものによってはサンプルのルームデータが入っています。Studio用はこれ含め2つしか見つからなかった。
**・楽曲**
曲に合わせて攻撃してくる耐久ボスをつくるので不可欠です。
**・自分でテストプレイするからといってヌルゲーにしない自制心**
以上です。全部タダで簡単に手に入ります。つくるぞ!
## 楽曲をいじる
唯一のmidi研要素です。コンピレーションアルバムで提出させていただいたカス曲を引っ張ってきました。1秒30フレームだと思うのでとりあえずBPMを240まであげておきました。midi研要素終わり。
## ステージをつくる
実際にボスの攻撃を避けるステージをつくります。ブロックは別に置かなくてもいいですが、置くとy軸方向へも避けられるので自由度が増します。あとはボスの画像を設定して完成です。
<img src="https://i.imgur.com/f09obt1.png" width="500">
こうなりました。俗にいう「って、なんで俺くんが!?」というやつです。しっかり手に持っているパチンコから弾が射出されます。全人類[House](https://store.steampowered.com/app/1444350/House/?l=japanese)やれ
## ボス攻撃を組む
山場です。とりあえずボスの攻撃パターンが書かれてそうなところを見つけて、序盤だけでも中身を確認してみます。
```
if (instance_exists(objPlayer))
{
timer += 1;
if (timer == 10){event_user(0);}
else if (timer == 20){event_user(1);}
else if (timer == 25){event_user(2);}
else if (timer == 35){event_user(0);}
else if (timer == 40){event_user(1);}
else if (timer == 50){event_user(2);}
else if (timer > 60 && timer < 100)
{
if (timer mod 2 == 1)
{
var a = instance_create(x,y,objCherryRandom);
a.direction = 180;
a.speed = 10;
}
}
...
//ソースコードの著作権とか怖いので一部書き換えてます。
```
なんかめちゃくちゃ力づくじゃないですか?GameMakerでは毎フレーム呼び出されるstepイベントというものがあります。”うにちー”でいう”あっぷでーとめそっど”のことらしいです。その中に書いてありました。変数timerを設けてフレーム数をカウントして、規定フレームに到達したら攻撃を発生させるみたいです。思ったより一目でわかりやすくて助かりました。エンジン様様ですわほんと。概観は分かったので後はフレームごとにちょこちょこ合わせるだけ!やるぞ!
### 乱数
<img src="https://i.imgur.com/9Mz4izU.gif" width="500">
もともとエンジンに入っていた攻撃パターンです。弾がずっと一直線。おもんな。安置だらけです。回避パターンを固定させないためにも弾の射出角度をランダムにしないといけません。円形の攻撃なので射出角度を`random_range(0,30)`とかにするといい感じになります。今の時代、あらゆるゲームでプレイヤーの命(財布)が乱数に握られているんですから、キッド君の命を乱数に預けないわけにはいきません。
~~結局前回のビビバスガチャPU確定まで回しても杏出なかったな...~~
### 自機狙い
弾幕ゲーお馴染みの自機狙いです。移動に臆してその場にとどまると有無を言わさずブチ抜かれるので常に動いていなきゃいけない厄介な攻撃です。人生と同じですね。
<img src="https://i.imgur.com/gJN2SaB.gif" width="300">
`direction= point_direction(x,y,objPlayer.x,objPlayer.y);`としました。さくらんぼビームがキッド君めがけて放たれます。実際にどうやって回避するかは後で考えます。
### スクリプト
以上の攻撃は既存の関数やらパラメタやらをこねこねするだけですぐできます。が、もっと複雑なことしようとするとやっぱり自作スクリプトが必要になるんですよね。
```
function scrMakeStar(argument0, argument1, argument2, argument3, argument4, argument5) {
var spawnX = argument0;
var spawnY = argument1;
var spawnAngle = argument2;
var spawnNum = argument3;
var spawnSpeed = argument4;
var spawnObj = argument5;
for (var i = 0; i < 5; i += 1){
var sx = spawnX + cos(degtorad(72 * i + 90) + spawnAngle);
var sy = spawnY + sin(degtorad(72 * i + 90) + spawnAngle);
var sx2 = spawnX + cos(degtorad(72 * (i + 2) + 90) + spawnAngle);
var sy2 = spawnY + sin(degtorad(72 * (i + 2) + 90) + spawnAngle);
var a = instance_create(sx, sy, spawnObj);
for(var j = 1; j < spawnNum; j += 1){
var b = instance_create(sx + (sx2 - sx) * j /spawnNum, sy + (sy2 - sy) * j / spawnNum, spawnObj);
a.speed = point_distance(spawnX, spawnY, a.x, a.y) * spawnSpeed ;
a.direction = point_direction(spawnX, spawnY, a.x, a.y);
b.speed = point_distance(spawnX, spawnY, b.x, b.y) * spawnSpeed;
b.direction = point_direction(spawnX, spawnY, b.x, b.y);
}
}
}
```
試しに組んだスクリプトです。しっかりプログラミングやってる人から見たら発狂するくらいスパゲッティだと思うんですけど...sx2のところとかもっと何とかなると思うんですけど...プロ研じゃないので...動けばオーケーということで...これだけで1時間くらいかかったので...speedの値が永遠に分からなかった...
<img src="https://i.imgur.com/oWuz5LV.gif" width="500">
こんな感じのハイパー殺意マシマシ星型アタックができます。やったー!
## 完成する
とりあえず一回キッド君を無敵にして動かしてみます。
{%youtube lwv3r4MBgZQ %}
まともな録画ソフトを持っていないのでガビガビ極まれりですけれどもこんな感じになりました。ね、クリアはまた今度でいっか。
## おわる
以上、何も知らんけどアイワナの耐久ボスをつくった話でした~。
もっと激闘を交わすかと思ってアドカレ登録した瞬間くらいから取り組み始めたんですけど、形だけなら思ったよりサクッとつくれましたね。反面、どうすれば分からなくて逃げた点も多々ありました。オブジェクトの回転とかめちゃめちゃ躓いた。問題解決能力の欠如~~~~プロ研の方々の凄まじさを改めて実感しました。
明日はまぐくんの記事です。本物のプロ研じゃん!!!囲め囲め!!!