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

Похожие записи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *