基于RealTutsGML波次游戏的Bot Player仅对单个敌人生效问题求助
问题诊断与修复:Bot仅响应最新生成的敌人
嘿,我来帮你拆解下为什么你的Bot只对最新生成的敌人有反应,以及怎么修复这个问题——这在波次敌人生成的游戏里是个非常常见的坑!
核心问题分析
你的Bot逻辑大概率是用单个变量存储要躲避的敌人目标了,每次新敌人生成时,这个变量会被直接覆盖成新敌人的实例,导致之前的敌人引用完全丢失,自然就只会盯着最新的那个敌人走。结合你提到的“敌人周围的圆形检测区域”,咱们一步步来修复:
1. 先把敌人实例统一管理起来
首先你需要放弃单个变量的思路,改用列表/数组来存储所有活跃的敌人,这样Bot就能遍历所有敌人进行检测:
// 在游戏初始化事件(比如房间开始事件)创建全局敌人列表 global.enemies = ds_list_create(); // 在敌人对象的【创建事件】里,把自己加入列表 ds_list_add(global.enemies, id); // 在敌人对象的【销毁事件】里,从列表移除自己(避免引用无效实例) ds_list_delete(global.enemies, ds_list_find_index(global.enemies, id));
2. 重构Bot的躲避检测逻辑
现在Bot需要遍历所有敌人,判断哪些在检测范围内,再执行躲避动作。这里分两种情况给你方案:
方案A:基于距离的检测(适合你提到的圆形区域)
// Bot对象的【Step事件】代码 var closest_enemy = noone; var closest_dist = 99999; // 设一个很大的初始值 // 遍历所有活跃敌人 for(var i = 0; i < ds_list_size(global.enemies); i++){ var enemy = global.enemies[| i]; if(instance_exists(enemy)){ // 先确认敌人还存在 var dist = distance_to_object(enemy); // 检查是否进入敌人的圆形检测范围 if(dist < enemy.detection_radius){ // 假设你给敌人加了detection_radius变量控制范围 // 记录最近的敌人(也可以改成同时处理多个敌人的逻辑) if(dist < closest_dist){ closest_dist = dist; closest_enemy = enemy; } } } } // 如果找到需要躲避的敌人,执行躲避动作 if(closest_enemy != noone){ // 计算远离敌人的方向(原方向加180度) var escape_dir = point_direction(x, y, closest_enemy.x, closest_enemy.y) + 180; // 让Bot向远离的方向移动 move_towards_point(x + lengthdir_x(5, escape_dir), y + lengthdir_y(5, escape_dir), 3); }
方案B:基于碰撞体的检测(如果你给敌人做了独立的圆形检测碰撞体)
如果你给每个敌人都加了一个专门的圆形碰撞体作为检测区域,那可以直接用碰撞列表来获取所有靠近的敌人:
// Bot对象的【Step事件】代码 // 获取所有靠近的敌人检测区域 var detection_instances = instance_place_list(x, y, obj_enemy_detection, [], false); if(array_length(detection_instances) > 0){ // 如果有多个敌人靠近,计算平均躲避方向(避免Bot左右横跳) var total_escape_dir = 0; for(var i = 0; i < array_length(detection_instances); i++){ var enemy = detection_instances[i].parent_enemy; // 假设检测体存了对应的敌人实例 total_escape_dir += point_direction(x, y, enemy.x, enemy.y) + 180; } var avg_escape_dir = total_escape_dir / array_length(detection_instances); // 执行移动 move_towards_point(x + lengthdir_x(5, avg_escape_dir), y + lengthdir_y(5, avg_escape_dir), 3); }
3. 额外注意点
- 一定要在敌人销毁时从全局列表移除,否则会出现引用无效实例的报错
- 如果你想让Bot同时躲避多个敌人,可以调整逻辑,比如计算所有敌人的“排斥力”合力方向,而不是只追着最近的一个跑
- 检查变量作用域,别把敌人列表或者目标变量定义在局部作用域里,不然每次Step都会重新初始化
内容的提问来源于stack exchange,提问作者msacco
相关产品推荐
相关产品推荐

