GameMaker: Windows-специфичные функции для Studio

Работая с одним из недавних проектов, я наткнулся на несколько проблем, встречаемых многими - даже если вы делаете игру лишь для Windows в GameMaker: Studio, вы не можете работать с файлами вне папки программы в AppData (нельзя даже работать с папкой, где программа установлена). Так же нет функций для открытия файлов в внешних программах, так что никаких вам "readme" в папке программы с открытием их из игры, никаких портативных файлов настроек, некоторых других вещей... грустно, в общем-то.
Поэтому я потратил вечер и сделал компактный DLL, который добавляет эквиваленты павшим функциям (sleep, execute_shell, I/O без песочницы) для Windows таргета. Поддерживаемые функции следующие:

Читать далее

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: Перетягивание вида/камеры

vis-view-drag

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

Читать далее

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

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

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

Скачать GMK

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

Window sliding example for GameMaker

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

Читать далее

GameMaker: Рекурсивное копирование папок

Иногда вам может понадобится скопировать папку во время выполнения вашей GameMaker игры. И, казалось бы, это должно быть просто... но не настолько просто. file_copy может лишь копировать файлы, а функции для работы с папками могут создавать, проверять на существование, и искать файлы в папках. Но, имея упомянутые функции для папок, можно довольно легко реализовать функцию копирования папки.
Используемая тут идея заключается в том, что список файлов в исходной папке заносится в массив, после чего проходом по файлам определяется, нужно ли их копировать как файлы (через file_copy) или папки (через рекурсивный вызов скрипта). Конечно, рекурсивные вызовы представляют определенный риск, если вы бы, к примеру, решили скопировать содержимое одного локального диска на другой, но вы же не собираетесь делать такие вещи посредством GameMaker... правда?

Приложенный пример содержит в себе функцию и простую демонстрацию работы (вводить пути двух папок нужно вручную).

Скачать GMK

Исходный код ниже,

Читать далее

GameMaker: Простые костные анимации

Этот пример демонстрирует создание довольно простых "костей" в GameMaker. Таковые могут быть использованы для анимации персонажей и уровней, если они могут быть разбиты на отдельные части в какой-то степени.

Преимущества

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

Реализация

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

Приложенный пример включает в себя минималистичную систему для соединения и рисования "костей", а так же некого сорта процедурную анимацию.

Скачать GMK

GameMaker: Тень в платформерных играх

Вообще-то этот пример я сделал довольно давно (дата создания файла гласит "Сентябрь 2010"), который я недавно исправил и улучшил по запросу.
Он демонстрирует простой алгоритм для отбрасывания тени объектом в платформерной (вид сбоку) игре. То есть, когда игрок прыгает, тень остается на земле (реализм!).
Ради простоты и производительности, расчет теней по умолчанию производится по рамкам объектов. Для "попиксельных" проверок у твердого объекта среди родителей должен быть obj_complex.
Если вам интересна техническая сторона, работает это следующим образом:

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

Скачать GMK

GameMaker: Перемешивание строк

Перемешивание строк в GameMaker

Этот минималистичный пример предоставляет функцию для перемешивания строк. То есть, возвращаемая строка содержит все символы из исходной, но размещенные в случайном порядке.

Скачать GMK

Читать далее