
AIと作る「ブロックダンジョン」 プレイヤー編

前回までは、ブロックを自動配置するシステムを作った。
この自動配置とボロック崩しをベースにローグライクなブロックダンジョンを作っていく。
アドバイザーのAIはCopilotさん
ローグライクなブロックダンジョン

「ダンジョン」×「ブロック崩しアクション」
ゲーム概要
◎ローグライクな毎回変わるブロックダンジョン!
◎タメ撃ちでボールを発射し敵やブロックを破壊!
◎ザコをぶっ飛ばしてボールに!?
◎ボスの発射する弾も打ち返せる!?
◎トルネコみたいに強い武器やアイテムを取って帰る
「ゴールまでの逆算」でタスク化
タスクリスト
①プレイヤーを作る
▢ 移動とガイドと通常攻撃
▢ タメ撃ちでボールを発射
▢ ボールを打ち返す
②ボールザコを作る
▢ 移動と索敵
▢ ザコをぶっ飛ばしてボールとして利用
③テストステージでテスト
▢ 仮ブロックを配置してテスト
④敵を作る
▢ 突進敵
▢ ボール発射敵
▢ プレイヤーのダメージ処理
⑤ダンジョンの自動生成
▢ 自動生成のルールを作る
▢ ダンジョンの大きさなどを設定
⑥アイテムの自動生成
▢ アイテムの発見とパワーアップ
▢ 持ち帰って装備して再チャレンジ
⑦ボス戦
▢ 突進敵やシューティング敵、ザコ呼びなど
①プレイヤーを作る
移動とガイド

矢印キーを使った8方向移動は以前に作ったものを流用。
今回は、移動だけでなく8方向に攻撃できるようにしたいのだが、絵を8方向に描くのはしんどいので、左右反転+ガイドで向きがわかるようにする。
左右反転のコードを教えて
水平反転は、image_xscale = -1でできます。

ということで、右向きのスプライトを用意して、
image_xscale = 1; // 右矢印が押された時
image_xscale = -1; // 左矢印が押された時
というコードを追加した。これで移動方向に応じて絵が左右に反転される。
8方向のガイドを出したい
プレイヤーが矢印キーの入力に応じて8方向に向きを変えるためには、キャラクターの向きと矢印を更新する必要があります。
Step 1: キャラクターの向きの初期化
まず、キャラクターの向きを管理する変数を初期化します。
Step 2: 矢印キーの入力をチェックし、向きを更新
Stepイベントで矢印キーの入力をチェックし、キャラクターの向きを更新します。
Step 3: 矢印を表示する
キャラクターの向きに応じて矢印を表示するためには、スプライトを回転させます。矢印スプライトを用意し、そのスプライトをキャラクターの方向に応じて回転させます。
obj_dir ガイドのオブジェクト
// Createイベント
direction = 0;
// Stepイベント
// 矢印はプレイヤーを追従
x = obj_player.x
y = obj_player.y
if (keyboard_check(vk_up)) {
if (keyboard_check(vk_right)) {
direction = 45; // 右上
} else if (keyboard_check(vk_left)) {
direction = 135; // 左上
} else {
direction = 90; // 上
}
} else if (keyboard_check(vk_down)) {
if (keyboard_check(vk_right)) {
direction = 315; // 右下
} else if (keyboard_check(vk_left)) {
direction = 225; // 左下
} else {
direction = 270; // 下
}
} else if (keyboard_check(vk_right)) {
direction = 0; // 右
} else if (keyboard_check(vk_left)) {
direction = 180; // 左
}
image_angle = direction; // 矢印のスプライトを回転

タメ撃ちでボール発射
スペースキーを押し続けた後、離すとボールを発射するプログラム
このプログラムは、スペースキーを押し続けた後にボールを発射するようにするための基本的な手順を示します。
Step 1: 変数の初期化
まず、オブジェクトに必要な変数を追加します。
Step 2: キー入力の処理
スペースキーが押されている間、時間を計測します。押し続けている間、chargingフラグをtrueに設定し、タイマーを増加させます。
Step 3: ボールの発射処理
スペースキーが離された時にボールを発射します。ボールの速度や方向を設定するコードを追加することもできます。
AIのコードを修正し、発射可能になったら黄色くなるのを追加。
ガイドの方向に発射するようにしたのがこちら。
// チャージ攻撃設定
charge_time = 0; // チャージ攻撃の初期時間
charging = false; // チャージ攻撃したか?
ok_charge = 30; // チャージ時間
// タメ撃ち
if (keyboard_check(vk_space) and !instance_exists(obj_ball) and damage_hit == false) {
charging = true;
charge_time += 1; // マイフレームごとにカウント
if (charge_time >= ok_charge) image_blend = c_yellow;
} else {
// スペースキーを離した時、充電時間が1秒(60フレーム)以上ならボールを発射
if (charge_time >= ok_charge and damage_hit == false) { // ボールを発射する処理
instance_create_layer(x, y, "Instances", obj_ball);
obj_ball.direction = obj_dir.direction; // 矢印の向きにボールを発射
}
// 充電時間をリセット
image_blend = blend_color;
charge_time = 0;
}
発射するボールはブロック崩しのボールを使用。
消えたら、charging = false;を変えるようにしている。
発射したボールを打ち返す
ブロック崩しでボールを打ち返す処理は実装済み。

今回は、通常攻撃もガイドの方向に出るように修正した。
今回作ったプレイヤー

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