GameMaker: «шифр» замен

Этот пример предоставляет функцию для преобразования строки, заменяя все символы, находящиеся в первом "алфавите" символами из второго "алфавита". Это может быть использовано для массовых замен символов в строках (например для превращения "Hello World" в "H3110 W0r1d") или же как простое шифрование (желательно как элемент игры, нежели для защиты важных данных... а то я видел случаи).
Функциональная часть состоит из единственной функцией string_subst(string, from, to), принцип действия которой описан в первом параграфе. Если длины обоих "алфавитов" равны, и они не содержат повторяющихся символов, вывод функции может быть "расшифрован" повторным ее запуском с зашифрованным текстом в качестве строки, и алфавитами "наоборот" (первый вместо второго и второй вместо первого). Пример:
var asrc, adst, source, encr, decr;
asrc = "0123456789"; // входной "алфавит"
adst = "3456789012"; // выходной "алфавит"
source = "51;"; // исходный текст
encr = string_subst(source, asrc, adst); // "зашифрованный" текст
show_message(encr); // Покажет "84;"
decr = string_subst(encr, adst, asrc); // "расшифрованный" текст
show_message(decr); // Покажет "51;"
Приведенный пример демонстрирует как шифрование, так и расшифровку. А так же включает в себя миловидный интерфейс.

Скачать GMK

GameMaker: Случайно прокручиваемые символы

Этот пример демонстрирует определенную вещь которую я хотел сделать на протяжении нескольких дней - скрипт для преобразования строк в набор меняющихся случайных символов.

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

Для оптимизации процесса рисования кодом генерируется коллекция (ds_map) с информацией о ширине символов для каждого шрифта при первом использовании. Это делает преобразования довольно быстрым даже для GameMaker: Studio с его ограничением в 65000 символов на шрифт.

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

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

Скачать GMK

GameMaker: Поле ввода

Есть множества случаев, в которых вам может понадобится дать пользователю возможность вводить текст привычным способом, принимая во внимания системные настройки и предоставляя возможность мелких изменений (таких как передвижение курсора по тексту). Такие случаи включают в себя чаты, консольные интерфейсы, поля ввода текста, и прочее. Этот пример покрывает большинство типичных потребностей для таких вещей довольно коротким (менее 70 строк) и понятным кодом. Он включает в себя следующие особенности:

  • Сохраняет текущий текст при потере фокуса окна. Если вам доводилось работать с вводом текста в GameMaker, возможно вы уже заметили это неприятное стандартное поведение.
  • Позволяет перемещать курсор по вводимой строке (кнопки влево / вправо / home / end)
  • Позволяет удалять символы после курсора с помощью Delete (почему я не вижу этого во многих играх?)
  • Может быть легко модифицирован для добавления дополнительных сочетаний клавиш и функций

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

Скачать GMK

GameMaker: Jetpack платформер

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

Скачать GMK

GameMaker: Столкновения с 2D массивом


Внешний вид и внутреннее устройство

Этот пример демонстрирует организацию системы с информацией о уровне сохраненной в виде двухмерного массива (каждая ячейка хранит индекс блока) и организацию системы столкновений с уровнем этого вида.
Можно сказать, что это упрощенная версия сделанного мной ранее движка-примера "Terra". Другие отличия состоят в использовании массивов вместо структур данных, и совместимость с Lite версией для GameMaker <= 8.1. С использованием массивов уходит возможность создания бесконечных миров (ограничение двухмерных массивов - 32000х32000 ячеек), но конечному пользователю это все равно вряд ли понадобится.
Как приятное добавление для русской версии поста, пример теперь содержит более детальные объяснения, и они изложены на русском.

Скачать GMK

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


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

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

Скачать GMK

Haxe/Neko: пример соединения клиент-сервер (чат)

В последнее время я искал примеры реализации соединений "клиент-сервер" для Haxe, но не мог найти ничего стоящего. Через некоторое время все таки удалось узнать что эти вещи реализуются посредством класса sys.net.Socket, и что непосредственно с ним никто не работал. Позже так же было выяснено, что в определенной степени этот класс должен отражать реализацию POSIX сокетов. Конечно это хорошо, но просто чтением man тут обойтись не удалось, так как в отличии от упомянутых, Haxe реализация использует исключения вместо возвращаемых значений. А исключения, в свою очередь, никто документировать не стал.

После некоторого количества экспериментов (так же известно как "метод тыка"), мною был найден полу-простой способ работы с "блокирующими" сокетами.

Читать далее