Итак, у меня есть система «триггеров» в моде для Pizza Tower, я сделал так, чтобы были родительский obj_trigger
и дочерний obj_delay
, у родителя есть метод для выполнения основного функционала триггера.
obj_trigger Создать
trigger_id = -1;
target_trigger_id = -1;
on_enter = 1;
on_touch = 0;
on_trigger = 0;
multi = 0;
activated = 0;
execute = function(triggered) //gml_Script_anon_gml_Object_obj_trigger_Create_0_0_gml_Object_obj_trigger_Create_0
{
var triggered = argument0;
}
obj_trigger Начало комнаты
if (on_enter && (!activated))
{
execute(false)
if (!multi)
activated = 1;
}
obj_delay Создать
event_inherited()
delay = 1
execute = function(argument0) //gml_Script_anon_gml_Object_obj_delay_Create_0_0_gml_Object_obj_delay_Create_0
{
var triggered = argument0
if (triggered && (!on_trigger))
return;
if (triggered && activated)
return;
if (triggered && (!multi))
activated = 1
if ((delay == 0))
alarm[0] = 1
else
alarm[0] = (delay * room_speed)
}
Проблема в том, что я пытаюсь перезаписать gml_Script_anon_gml_Object_obj_trigger_Create_0_0_gml_Object_obj_trigger_Create_0
новым методом, но вместо этого он превращается в gml_Script_anon_gml_Object_obj_delay_Create_0_0_gml_Object_obj_delay_Create_0
Я использую UndertaleModTool, поэтому не знаю, имеет ли это какое-то отношение.
В GameMaker функциональные литералы «сглаживаются» во время компиляции, поэтому
greet = function(name) {
return "hi, " + name + "!";
}
становится чем-то вроде
greet = method(self, gml_Script_anon_1);
с gml_Script_anon_1
содержащим
return "hi, " + argument0 + "!";
Если вы пытаетесь перезаписать метод внутри события, вы можете найти его отдельно в списке «Сценарии», хотя это зависит от реализации UTMT.
Это не сработало, он просто сказал, что методы, которые я определил, не были определены, поэтому, если вы не знаете других, я, возможно, воспользуюсь неуклюжей, но работающей системой сигнализации, возможно, ошибки на данный момент связаны с UTMT, я не знаю.
Я думаю, это может быть из-за реестра функций или чего-то в этом роде, я слышал, что это проклятие data.win, если каким-то образом вы заставляете UTMT думать, что это функция, без использования gml_Script_anon.
Если вы не можете добавить новый литерал функции, вы можете добавить обычный скрипт и привязать его к экземпляру с помощью method
(или не привязывать его к экземпляру и использовать script_execute
для его запуска)
Это могло бы сработать, но я нашел текущий ответ намного лучше и понятнее, к тому же вы могли не понять вопрос.
some()
уже должен компилироваться в self.some()
, когда нет вызываемой функции/скрипта some
, но это может быть проблемой с UTMT — посмотрите, легко ли это воспроизводится, и если да, сообщите об ошибке.
Способ исправить это:
Всегда добавляйте к своим методам префикс self.
.
Например, чтобы избежать создания function buffer thing
несуществующей функции в любых других файлах, вы можете сделать, например:
self.execute()
Таким образом, вы можете сделать execute = function() {things here}
для дочернего элемента, и родительский скрипт выполнит новое определение функции!
Кроме того, здесь используется UTMT:CE, и если вы поставите self.
, и он удалит его, это потому, что в этом нет необходимости, если он сохранит его, это имеет значение.
Я сделал этот вывод путем небольшого тестирования, так что все может быть неправдой.
Я думаю, это сработает. Так стоит ли мне также использовать метод_call?