GameMaker: Нахождение ресурсов по имени

Если вы работали с GameMaker, вам наверняка хоть раз хотелось написать код вроде такого:

instance_create(x, y, 'obj_item' + string(irandom_range(1, 3)));

Но, как вы, возможно, заметили, просто так это сделать нельзя. Это происходит потому, что идентификаторы ресурсов - числа, а не строки. Обычно советуют сделать что-то вроде этого:

var i;
switch (irandom_range(1, 3)) {
	case 1: i = obj_item1; break;
	case 2: i = obj_item2; break;
	case 3: i = obj_item3; break;
}
instance_create(x, y, i);

Это работает (и работает, стоит сказать, довольно быстро), но ручное написание таких фрагментов кода - сомнительное удовольствие. Даже более сомнительное, если вы хотите использовать сложные правила формирования имени (spr_player_действие_v_вариация).
Другой подход, который нередко используется, выглядит так:

execute_string('instance_create(x, y, obj_item' + string(irandom_range(1, 3)) + ');');
// Некоторые говорят, что вы - ужасный человек, если используете такой код.

Но, увы, это - плохая идея, поскольку это заставляет GameMaker разбирать (парсить) данный кусок кода при каждом вызове. А, ну да, и это так же не будет работать в GameMaker: Studio, поскольку функции динамического скриптинга были удалены из программы с корнями.
В этот момент можно было бы остановится и спросить:

А что же тогда предлагаешь ты?

А я бы ответил:

Рабочее решение, конечно же.

А если серьезно, используйте ds_map. Это - довольно элегантно, потому что поиск слабо зависит от количества ресурсов, и единственная истинно ресурсоемкая операция должна быть выполнена в начале выполнения игры.
Пример, приведенный в конце данной записи, включает в себя такую функцию инициализации, как и простой интерфейс для непосредственного поиска:

instance_create(x, y, object_find('obj_item' + string(irandom_range(1, 3))));

Если же вы используете GameMaker: Studio версии 1.1 или выше, процесс становится еще проще - ведь в программу была добавлена функция asset_get_index(имя ресурса), что имеет подобное назначение (с тем различием, что тип ресурса в ней указывать не нужно).
Пример в формате GMZ прилагается ради совместимости с более ранними версиями.

Скачать GMK Скачать GMZ

GameMaker: Соединяемые объекты


Я конечно не специалист по странным вертолетам, но, похоже, это - один из них.

Этот довольно полезный пример предоставляет систему для "соединения" объектов между собой, то есть "дочерние" объекты будут перемещаться относительно их "родителя" с учетом позиций и вращения.
В свою очередь к "дочерним" объектам можно прицеплять еще объекты, позволяя добавить потенциально бесконечное количество "уровней экземпляров", что будут перемещаться вместе.
Хорошими примерами применения таких систем являются игры с "модульной" техникой (танки, какие-либо корабли с орудиями на борту, прочее), и состоящие из множества фрагментов боссы.

Скачать GMK