AIと作る「ブロックダンジョン」 スライムボール編
AIと作るブロックダンジョン。
前回は、ボールをチャージショットする「プレイヤー」を作った。
今回は、ぶっ飛ばすと敵を巻き込んで攻撃できる「スライムボール」を作る。
アドバイザーのAIはCopilotさん
ローグライクなブロックダンジョン
「ダンジョン」×「ブロック崩しアクション」
②ザコ「スライムボール」を作る
移動と索敵
移動:ボールの動きをベースに何かにぶつかると跳ね返るようにする
索敵:プレイヤーが索敵範囲に入ったら追いかける
索敵内のプレイヤーを何秒かに1回追いかけるプログラムを教えて
ということで、右向きのスプライトを用意して、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; // ダメージフラグを戻す
通常攻撃はヒットバック、チャージショットでボールを当てるとぶっ飛ばして他の敵を巻き込むようになった。
ブロックダンジョンへの道
今回はボールザコを作った。次回は、敵のバリエーションを作って遊ぶ。