
AIと作る「ブロックダンジョン」 スライムボール編

AIと作るブロックダンジョン。
前回は、ボールをチャージショットする「プレイヤー」を作った。
今回は、ぶっ飛ばすと敵を巻き込んで攻撃できる「スライムボール」を作る。
アドバイザーのAIはCopilotさん
ローグライクなブロックダンジョン

「ダンジョン」×「ブロック崩しアクション」
ゲーム概要
◎ローグライクな毎回変わるブロックダンジョン!
✅タメ撃ちでボールを発射し敵やブロックを破壊! ⇐ 前回
◎ザコをぶっ飛ばしてボールに!? ⇐ 今回
◎ボスの発射する弾も打ち返せる!?
◎トルネコみたいに強い武器やアイテムを取って帰る
②ザコ「スライムボール」を作る
移動と索敵
移動:ボールの動きをベースに何かにぶつかると跳ね返るようにする
索敵:プレイヤーが索敵範囲に入ったら追いかける
索敵内のプレイヤーを何秒かに1回追いかけるプログラムを教えて
まずは索敵範囲を設定し、範囲内にプレイヤーがいるかどうかを確認して追いかける処理を行います。タイマーを使用して、索敵処理を何秒かに1回だけ行うように設定できます。
Step 1: 捜索範囲の設定とタイマーの初期化
まず、敵キャラクターの索敵範囲を定義します。
例えば、radiusを使って索敵範囲を円形に設定します。
また、索敵タイマー用の変数を初期化します。
Step 2: タイマーを更新
毎フレームごとにタイマーを更新します。
Step 3: 索敵処理の実装
一定の間隔で索敵処理を行います。索敵範囲内にプレイヤーがいるかどうかを確認し、追いかける処理を行います。

ということで、右向きのスプライトを用意して、AIのコードを参考にコードを書く。(※gamemakerでは0度が右なので常に右向き)
obj_slime
Create Event(作成)
// 索敵関連
detection_radius = 100; // 索敵範囲
detection_timer = 0; // 索敵タイマーの初期化
detection_interval = 30; // 索敵頻度
Step Event(ステップ)
// 索敵
detection_timer += 1;
if (detection_timer >= detection_interval and damage_hit == false) {
if (point_distance(x,y, obj_player.x, obj_player.y) < detection_radius) {
direction = point_direction (x, y, obj_player.x, obj_player.y);
}
detection_timer = 0;
}

移動と停止を繰り返しながら、0.5秒に1回索敵。
何かとぶつかると方向転換。
プレイヤーが索敵範囲に入ると追いかけ、ロストするとそのままの方向に移動するようにできた。
ザコをぶっ飛ばしてボールとして利用
ザコにボールをぶつけると、ぶっ飛びダメージになり、かなり遠くに飛んでいくようにした。ダメージ中に行動しないようにする処理もする。
攻撃側とダメージ側両方に処理を入れちゃったのでややこしい。
モックは研究しながら作るので、コードがガタガタになっちゃう。
本当にプログラマーの皆さんの大変さが良くわかる。感謝。
obj_ball Create Event(作成)
// 敵へのダメージ
damage_timer = 60; // 敵のぶっ飛び時間
obj_ball コリジョンイベント > obj_slime
move_bounce_all(true); // ボールの反射方向
life -= 1; // ボールにダメージ
other.life -= 1; // 敵にダメージ
other.damage_hit = true; ぶっ飛びダメージ中のフラグ
other.direction = point_direction (x, y, other.x, other.y); // 敵の反射方向
other.speed += other.damage_spd; // 敵のぶっ飛び速度
instance_create_layer(x, y,"hitmark",obj_hitmark); // ヒットマーク
if (hspeed = 0) direction += random_range(-10,10); // 横カンカンはランダムに弾く
if (speed <= spd) speed = spd; // 最低速度を守る
instance_destroy(); // ボールを破壊
obj_slime Create Event(作成)
// スライムのHP
life_max = 5;
life = life_max;
// ダメージ関連
damage_spd = 5; // ぶっ飛び速度
damage_hit = false; // ダメージ中フラグ
ball_hit_timer = 60; // 仮のぶっ飛び時間(※攻撃側優先)
damage_timer = 0; // 初期ダメージタイマー
death_timer = 0; // 死にぶっ飛び用のタイマー
obj_slime コリジョンイベント > obj_ball
alarm[0] = ball_hit_timer; // ボールが消滅した時の安全装置
obj_slime alarm[0]
speed -= damage_spd; // ぶっ飛びスピードを元に戻す
damage_hit = false; // ダメージフラグを戻す

通常攻撃はヒットバック、チャージショットでボールを当てるとぶっ飛ばして他の敵を巻き込むようになった。
ブロックダンジョンへの道
今回はボールザコを作った。次回は、敵のバリエーションを作って遊ぶ。
タスクリスト
①プレイヤーを作る
✅ 移動とガイドと通常攻撃
✅ タメ撃ちでボールを発射
✅ ボールを打ち返す
②ボールザコを作る
✅ 移動と索敵
✅ ザコをぶっ飛ばしてボールとして利用
③敵を作る
▢ 突進敵
▢ ボール発射敵
▢ プレイヤーのダメージ処理
④テストステージでテスト
▢ 仮ブロックを配置してテスト
⑤ダンジョンの自動生成
▢ 自動生成のルールを作る
▢ ダンジョンの大きさなどを設定
⑥アイテムの自動生成
▢ アイテムの発見とパワーアップ
▢ 持ち帰って装備して再チャレンジ
⑦ボス戦
▢ 突進敵やシューティング敵、ザコ呼びなど