При масштабировании программного кода возникла необходимость взаимодействия между собой большого количества объектов. Реализовывать внутри объектов ссылки на другие объекту идея не очень. Необходимо что бы взаимодействие осуществлялось между собой абсолютно не связанных между собой объектов. Что бы они понятия не имели о существовании друг друга но имели возможность "общения" между собой.

Функциональные требования к менеджеру:

1. Иметь возможность любому объекту подписки на событие сразу в событии Create(касается п.7), и отправка сообщения подписчикам с параметрами (это базовые требования).

2. Исключена возможность двойной подписки конкретного объекта, на конкретное событие.

3. Должна быть как ручная отписка, так и автоматическая, в случае уничтожения(исчезновения) объекта, да бы если подписчик вдруг "откинется" и не засорять пустыми данными структуру подписчиков.

4. возможность отписки от всего и сразу!

5. отложенная во времени отправка сообщений подписчикам - это значительно экономит такты процессорного времени в каждом шаге/step`е программы ,  так же решает проблему функциональной атомарности.

6. Возможность подписки сразу же в событии Create объекта, т.е. менеджер событий уже должен быть готов как штык к плотной работе!  

7. отвязка менеджера от базового "объекта менеджера" в комнате (или по крайне мере от хронологии его создания в комнате) касается п.1

8. простота использования

 

В результате на свет появился данный скрипт менеджера событий, выступающего в роли посредника между объектами.

И так содержимое скрипта sript_listen_manager.gml

Для упорядочивания и создание удобоваримого вывода отладочной информации запилен простеньки логировщик:

globalvar trace_isfirst;
trace_isfirst=true;

function _log(t){ show_debug_message(t);};
//*************************************************************************************
function trace() 
{
	if trace_isfirst then
	{
		trace_isfirst=false;
		_log("");_log("");
		_log("==============================================================================");

		_log("=                        Началo лoгa                                        =");		

		_log("==============================================================================");
	}	
	var r = string(argument[0]), i;	
	for (i = 1; i < argument_count; i++) 
	{
	  var _arg=argument[i];		
		if _arg=="1" then r += "true(1)";
		else if _arg=="0" then r += "false(0)";
		else r += "" + string(argument[i]);		
	}	
	var _oname = object_get_name(object_index);	
	
	var _iname = "";
	var e = _get_event(event_type) + "[" + string(event_number) + "]";	
	var _date = date_time_string(date_current_datetime()) + ": ";
	show_debug_message(_date + "object=(" + _oname + "" + _iname + "), event" + string(event_type) +"=("+ e + "): " + r);	
}

Выводятся в одну строку инфа "дата:время  объект:событие + допинфа в зависимости от аргументов"

Страница 2 из 2