ds_list 在游戏制作工作室中无法正常工作

ds_list Not working as inteded in game maker studio

当我尝试对我的所有目标使用 ds 列表时,我的代码出现了问题。似乎它不会注册任何东西,我不知道我做错了什么,我已经尝试了我所知道的一切。当我显示 ds 列表的值时,它始终为 0,即使我放入列表的碰撞 ID 也有值。当它由于某种原因没有与任何东西发生碰撞时,碰撞 ID 也默认为 -4。

这是将值分配给 ds 列表的代码。

//get all enemys in area
current_coli = collision_circle(x, y, tower_range, obj_enemys, 0, 1);
if (current_coli != noone){
    ds_list_add(collision_list, current_coli);
}

这是我尝试使用 中的 ds 列表的代码,什么也不做。

var i
for (i = 0; i < ds_list_size(collision_list) + 1; i++){
    target_test = ds_list_find_value(collision_list, i);
if (instance_exists(target_test) and (rectangle_in_circle(target_test.x - 7, target_test.y - 7, target_test.x + 7, target_test.y + 7, x, y, tower_range) > 0))
    {
      target = ds_list_find_value(collision_list, i);
      target.show_hp_bar = true;
      target.path_speed = target.path_speed * ((100 - slow)/100)
      show_debug_message(other.target); 
    }else{
        target.path_speed = target.start_speed; 
        ds_list_delete(collision_list, i);  
    }
} 

我无法执行该代码,因为 ds 列表不包含任何内容。正如我之前所说,"current_coli" 给出了对象的 ID,但由于某种原因它没有将它存储到 ds 列表中,"target_test" 始终是未识别的,而 ds 列表 "collision_list" 是始终为 0。代码位于地图上具有固定位置的对象步进事件内,并将效果应用于其碰撞半径内的敌方对象。

这是错误的:

//get all enemys in area
current_coli = collision_circle(x, y, tower_range, obj_enemys, 0, 1);
if (current_coli != noone){
    ds_list_add(collision_list, current_coli);
}

collision_circle returns 只有一个(最少)ID,不是所有 ID。你可以这样做:

with obj_enemys
{
    if point_distance(x, y, other.x, other.y) < other.tower_range
    {
        ds_list_add(other.collision_list, id);
    }
}

var i
for (i = 0; i < ds_list_size(collision_list) + 1; i++)

也错了。右:

for (var i=0; i<ds_list_size(collision_list); i++)
  1. 可以在for里面写var

  2. 你不需要+1.

还有一件事。当你这样做时

ds_list_delete(collision_list, i);

它改变了数据并打破了你的 for 循环。比如删除后可以减少i

ds_list_delete(collision_list, i);
i--;

或一行相同

ds_list_delete(collision_list, i--);