C/C++: Вывод цветного текста посредством WinAPI

Если вам доводилось делать попытки написания игр в виде "консольных" приложений Windows, то возможно вас интересовал вопрос,

А нельзя ли, к примеру, раскрасить выводимый текст?

И, стоит заметить, ответ на него не так уж и глубоко спрятан. Как факт, на MSDN есть целая секция, посвященная работе с консолями. Правда, она немного запутанная. И на английском. Но в остальном, нужную документацию в ней можно найти методом перебора функций из списка доступных. Но данная статья посвящена выводу цветного текста а не перебору, поэтому вернемся к нему.

Читать далее

Вектор: Логотип GameMaker: Studio в стиле Windows 8

логотип GameMaker: Studio logo в стиле Windows 8

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

Скачать SVG Скачать PNG Скачать HD PNG

Так же я сделал расширение загрузки для GameMaker: Studio HTML5' с этим логотипом, что выглядит примерно так:

Читать далее

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

Подобно другим записям о Notepad++ на этом блоге, эта так же содержит файл подсветки синтаксиса для него. Как можно угадать по заголовку, предназначается он для версий GameMaker Language (GML) использующихся в версиях раньше Studio.
Вообще-то этот файл подсветки был сделан некоторое время назад, но я его не опубликовывал так как существовало несколько других вариаций, делающих то же самое. Похоже что сейчас это не совсем так.

Данный файл определения поддерживает все стандартные структуры GameMaker Language. Так же он подсвечивает стандартные функции, константы, и "специальные" переменные (global/self/other). Цветовая схема сделана для соотвествия с подсветкой в самом GameMaker. К сожалению, на данный момент нет возможности определения и подсветки пользовательских переменных\констант\скриптов, но при нужде их можно добавить в группу ключевых слов 6 (Keyword Group 6) чтобы они были подсвечены.

Скачать UDF

Если же вам интересна подсветка для GameMaker: Studio, есть запись и об этом.

GameMaker: Обработка аппаратных кнопок на Android

Обработка аппаратных кнопок Android в GameMaker: Studio

Одним из часто задаваемых вопросов о GameMaker: Studio является вопрос о том, как обрабатывать нажатия стандартных кнопок на устройствах (Домой, Меню, Назад, Поиск).
Несмотря на предположения, обработка кнопок в GameMaker: Studio довольно проста - нажатия кнопок переназначаются на соответствующие кнопки клавиатуры. То есть для обработки нажатий можно использовать стандартные события нажатия/удержания/отпускания кнопок.

Меню

Кнопка "Меню" переназначается на кнопку клавиатуры "М" (индекс 77). Так же стоит заметить, что при использовании отладочного "плеера" игр (YoYoRunner) кнопка "Меню" открывает меню плеера (содержащее пункты "Настройки" и "Выход"), что может сделать тестирование без компиляции проблематичным.

Назад

Кнопка "Назад" (вероятно знакомая вам как смотрящая влево стрелочка) переназначается на кнопку стирания (Backspace, индекс 8). Все довольно просто и интуитивно.

Поиск

Нажатия кнокпи "Поиск" переназначаются в нажатия кноки Control (индекс 17). Мне не совсем понятна логика, солгасно которой выбор был остановлен на этом соответствии, но это уже вне контекста этой записи. Так же стоит заметить, что на некоторых моделях устройств этой кнопки может не быть вовсе, так что ассоциировать с ней какие-то критически важные действия не стоит.

Домой

Я не уверен, зачем вообще задается вопрос о том, можно ли привязать какое-то действие на кнопку "Домой". Нажатия этой кнопки обрабатываются операционной системой Android (обычно приводя к сворачиванию активного приложения и выходу на начальный экран), поэтому приложения ничего с ней делать не могут. Вы ведь не собирались держать игрока внутри игры до конца его/ее дней, не так ли?

Замечания

Несмотря на переназначение кнопок, в версии 1.1.917 аппаратные кнопки все еще не вызывают смены keyboard_lastkey / keyboard_lastchar. Так что лучше пока не использовать их в комбинации с этими переменными.

Надеюсь, это было полезным.

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

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

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

Скачать GMK

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

Читать далее

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

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

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

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

Реализация

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

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

Скачать GMK

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

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

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

Скачать GMK

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

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

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

Скачать GMK

Читать далее

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

Какое-то время назад я написал UDL2 описание для основанного на Lua языке под названием Killa.

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

Если вы не знаете что такое Killa, это - основанный на Lua скриптовый язык, который добавляет некоторые JavaScript-образные элементы синтаксиса (включая "обычные" циклы for, битовые операторы, ?:, операторы присвоения, и прочее), не теряя приятных частей Lua. Так же Killa не дает вам возможности незаметно сломать программу случайной утечкой переменных в "глобальное пространство".

Ещё есть тема об этом языке на форуме Love2d.

Скачать UDL

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