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++)
可以在for
里面写var
。
你不需要+1
.
还有一件事。当你这样做时
ds_list_delete(collision_list, i);
它改变了数据并打破了你的 for
循环。比如删除后可以减少i
ds_list_delete(collision_list, i);
i--;
或一行相同
ds_list_delete(collision_list, i--);
当我尝试对我的所有目标使用 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++)
可以在
for
里面写var
。你不需要
+1
.
还有一件事。当你这样做时
ds_list_delete(collision_list, i);
它改变了数据并打破了你的 for
循环。比如删除后可以减少i
ds_list_delete(collision_list, i);
i--;
或一行相同
ds_list_delete(collision_list, i--);