見出し画像

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

プレイヤー

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




アドバイザーのAIはCopilotさん


ローグライクなブロックダンジョン

「ダンジョン」×「ブロック崩しアクション」

ゲーム概要
◎ローグライクな毎回変わるブロックダンジョン!
✅タメ撃ちでボールを発射し敵やブロックを破壊! ⇐ 前回
◎ザコをぶっ飛ばしてボールに!?         ⇐ 今回
◎ボスの発射する弾も打ち返せる!?
◎トルネコみたいに強い武器やアイテムを取って帰る


②ザコ「スライムボール」を作る

移動と索敵

移動:ボールの動きをベースに何かにぶつかると跳ね返るようにする
索敵:プレイヤーが索敵範囲に入ったら追いかける

索敵内のプレイヤーを何秒かに1回追いかけるプログラムを教えて

まずは索敵範囲を設定し、範囲内にプレイヤーがいるかどうかを確認して追いかける処理を行います。タイマーを使用して、索敵処理を何秒かに1回だけ行うように設定できます。

Step 1: 捜索範囲の設定とタイマーの初期化
まず、敵キャラクターの索敵範囲を定義します。
例えば、radiusを使って索敵範囲を円形に設定します。
また、索敵タイマー用の変数を初期化します。

Step 2: タイマーを更新
毎フレームごとにタイマーを更新します。

Step 3: 索敵処理の実装
一定の間隔で索敵処理を行います。索敵範囲内にプレイヤーがいるかどうかを確認し、追いかける処理を行います。

Copilotさん
スライムボールのスプライト

ということで、右向きのスプライトを用意して、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;  // ダメージフラグを戻す


ぶっ飛ばし攻撃

通常攻撃はヒットバック、チャージショットでボールを当てるとぶっ飛ばして他の敵を巻き込むようになった。


ブロックダンジョンへの道

今回はボールザコを作った。次回は、敵のバリエーションを作って遊ぶ。

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

次は敵のバリエーションを作る

いいなと思ったら応援しよう!

この記事が参加している募集