Moje skrypty są tylko przykładem kompozycji, pomysłem jak można rozwiązać problem z wielokrotnym dziedziczeniem. Nie bardzo rozumiem, dlaczego nie możesz wykonywać skryptu:
if collision_line_list(x, y-hot_spot, x+sight_range, y-hot_spot, "grupa", false, true, spotted_list, true){ //seeing closest object
var closest = spotted_list[|0];
spotted_point = closest.x-x;
ds_list_clear(spotted_list);
if (instance_exists(obj_player)) && (closest == obj_player.id) && !(status = state.attack){ // change state to attack
status = state.attack;
angry = 30;
attack_buffer = 60;
} else { // not seeing
spotted_point = 0;
}
}
W każdym obiekcie z osobna. Dodatkowo żeby sprawdzić "grupę" obiektów, to możesz zrobić coś takiego:
var spotted_list = ds_list_create();
var instances = collision_line_list(x, y - hot_spot, x + sight_range, y - hot_spot, par_entities, false, true, spotted_list, true);
var enemy_spotted = false;
for (var i = 0; i < instances; i++) {
var inst = spotted_list[| i];
// sprawdzamy przynaleznosc do teamu
if (inst.team == "red" && status != state.attack) {
enemy_spotted = true;
spotted_point = inst.x - x;
status = state.attack;
angry = 30;
attack_buffer = 60;
break;
}
}
if (!enemy_spotted) {
spotted_point = 0;
}
ds_list_destroy(spotted_list);
Jeżeli boisz się o optymalizację, możesz ten fragment kodu zamiast wykonywać w Step Event, np. ustawić Infinite Alarm (alarm ustawiający sam siebie) i np. uruchamiać ten skrypt co jakiś czas np. 100ms. (16ms to jedna klatka przy 60fps)
Jeżeli chcesz dodać kilka team-ów, możesz zamiast zmiennej team dodawać zmienną teams jako tablicę, np.
teams[0] = "red";
teams[1] = "green";
Stworzyć skrypt do sprawdzania zawartości tablicy:
/// scr_array_includes(arr, value)
var arr = argument0;
var len = array_length_1d(arr);
for (var i = 0; i < len ; i++) {
if (arr[i] == argument1) {
return true;
}
}
return false;
I wtedy powyższy skrypt z collision_line_list można przerobić na:
var spotted_list = ds_list_create();
var instances = collision_line_list(x, y - hot_spot, x + sight_range, y - hot_spot, par_entities, false, true, spotted_list, true);
var enemy_spotted = false;
for (var i = 0; i < instances; i++) {
var inst = spotted_list[| i];
// sprawdzamy przynaleznosc do teamu (z grupy teamow)
if (scr_array_includes(inst.teams, "red") && status != state.attack) {
enemy_spotted = true;
spotted_point = inst.x - x;
status = state.attack;
angry = 30;
attack_buffer = 60;
break;
}
}
if (!enemy_spotted) {
spotted_point = 0;
}
ds_list_destroy(spotted_list);