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

Выпущен Terrasavr!

Terrasavr

О, привет. Очередной раз прошло некоторое время с того момента, как я делал тут запись, но у меня есть новости - сегодня я рад выпустить в свет программу под названием... Terrasavr! Terrasavr это редактор сохранений для игры Terraria, отличающийся от других программ этого класса внешним видом, функциональностью, и тем фактом, что запускается он прямо на веб-странице с использованием современных веб-технологий (JS+HTML5).
Terrasavr позволяет вносить изменения в внешний вид и характеристики персонажа, манипулировать предметами, искать и сравнивать существующие в игре предметы, etc.
Более детальное техническое описание доступно в английской версии данной записи. Или можете запустить и посмотреть 🙂

Запустить Terrasavr'а

Выпущен HaxMin

haxmin

После некоторого периода молчания тут, я выпустил HaxMin.
HaxMin - приложение для уменьшения объемов и степени читаемости JavaScript кода путем умного изменения имен функций, свойств, и переменных, а так же устранения необязательных (для выполнения программы) пробелов, символов, и переносов строк.

В то время как программа изначально предназначалась для использования с JavaScript кодом, созданным Haxe, она так же работает для JS файлов, созданных другими приложениями или вручную.

Более полная запись с принципами работы приложения пока доступна лишь на английском.

Страница проекта на Github

Notepad++: Подсветка синтаксиса для TurboProlog

В последнее время я занят подготовкой к выпуску ряда важных вещей, из-за чего интенсивность появления записей тут, скажем так, немного сократилась. Здравый смысл подсказывает мне, что забрасывать блог до выполнения какого-то условия не стоит.
Однажды я уже таким образом отложил игру в Warcraft III до момента, пока я не закончу работу над одним проектом.
И, знаете что... до игры в Warcraft я с тех пор так и не добрался. Не потому что я не закончил проект (хотя, стоит признаться, он занял времени больше чем я ожидал), а потому что возвращаться к игре и поддержке связанных с ней проектов после перерыва более чем в полгода было как-то неловко.
Было бы очень жаль если бы то же самое произошло с блогом, верно?

Поэтому, пока важные проекты проходят завершающие стадии тестирования, я добавлю сюда парочку "промежуточных" записей. Эта запись гласит о недавно написанном мной файле подсветки синтаксиса для Notepad++, например.

Читать далее

GameMaker: Перетягивание вида/камеры

vis-view-drag

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

Читать далее

GameMaker: Открытие проектов 5/6/7/8 версии в GameMaker Studio

Открытие GameMaker 8.1, 8, 7, 6, 5 проектов в GameMaker: Studio

Один из первых вопросов при переходе на GameMaker: Studio заключается в том, как открывать созданные в более ранних версиях (GameMaker 8.1, GameMaker 8.0, 7, 6.x, 5.x...) проекты. Если вы пришли сюда из поиска, то вероятно вы уже заметили что перетягивание файлов предыдущих версий на программу или попытки открытия их обычным способом не имеют никакого эффекта. В такие моменты приходят мысли этого рода:

Грустный рисованный человечек с надписью 'Переписать весь код?' над ним.

Но нет, конечно же не все так плохо (почему бы кто-то заставлял вас переписывать весь код?), и вы можете запустить ваши проекты в GameMaker: Studio импортировав их. Эта запись объясняет, как, и почему.

Читать далее

GameMaker: Монетки, магазины, и всплывающие надписи

Пример экономики для GameMaker
Давайте просто скажем что графика для этого примера взята из "абстрактной" коллекции.

Хотя я сделал этот пример долгое время назад, похоже что вопросы на эту тематику до сих пор задаются довольно часто, и имеет смысл сделать данный пример "находимым" с помощью этой записи.
Пример демонстрирует создание трех основных вещей:
  • Монетки, как подбираемый ресурс.
  • Всплывающий текст, используемый тут для отображения "+1" при подборе монеток, но имеющий много других применений (в том числе и отображение урона).
  • Магазины, продающие игроку полезные (или в данном случае безполезные) предметы за монетки.
В общем, довольно просто, но все равно полезно для тех, кто еще с этим не разобрался.

Скачать GMK

GameMaker: Эффекты скольжения окна

Window sliding example for GameMaker

Эта запись посвящена созданию эффекта аналогичного используемого в моей старой программе GMConveter. Вообще-то сама по себе программа была в некоторой степени шуткой, так как в момент ее выпуска единственная разница между файловыми форматами GM80 и GM81 была байтом версии в заголовке, который ей собственно и изменялся, делая файлы вновь совместимыми. Довольно неплохо для чего-то что было скачано более 4000 раз за два года, правда?
Помимо внутренней простоты программа так же имела неплохой внешний вид, включая эффект плавного скольжения окна. Об этом я и расскажу.

Читать далее

GameMaker: Самонаводящиеся ракеты

Пример самонаводящихся ракет для GameMaker

Вы любите самонаводящиеся ракеты? Все любят самонаводящиеся ракеты!
Ну, вообще возможно вы их и не любите, но для многих жанров игр такие снаряды могут добавить это нужное "немного сложнее.

Если вы не знаете как таковые работают, вот анимированая иллюстрация -

Читать далее

Haxe: Замена NME/Browser (Jeash)

Если вы работаете с HaxeNME то возможно вы замечали, что время от времени собранные приложения работают на JS/HTML5 не так как на остальных платформах. Или не работают вовсе. Или даже не собираются из-за какого-то недостающего кода.
Причины, в принципе, понятны - само по себе воссоздание Flash API на JavaScript+HTML5 не выглядит слишком легкой задачей, так как многие из функций существуют немного в другом виде или изначально не существуют вовсе, требуя некоторых ухищрений для реализации.
А состоящая из ухищрений кодовая база, конечно, не будет такой уж и стабильной, особенно при воссоздании функционала на основе "тестирования черного ящика".
К примеру, если вы решили на каждом кадре очищать какой-то буфер размером 640х480 пикселей с помощью BitmapData.fillRect, вы совершаете большую ошибку, так как данная функция делает это не просто попиксельно, а еще и с использованием ImageData.
В общем, данная статья посвящена замене в NME проекте browser/jeash библиотеки на свою при компиляции в JS.

Читать далее