• Ultimate Question - 42

    Ultimate Question 42

    Вчера закончился прием заявок на международный конкурс Ludum Dare. Разработчикам нужно за 72 часа (jam)

    Read more »
  • Worms Zone

    Worms Zone – червячная зона

    Worms Zone – онлайн-игра с динамичной сюжетной линией и забавной графикой. Начните растить своего червя

    Read more »
  • Way of Tanks

    Way of Tanks

    Way of Tanks – это танковый ранер с бесконечным геймплеем и разнообразной трассой. Игрок свайпами

    Read more »
  • Road Fighter

    Road Fighter

    Road Fighter — видеоигра в жанре аркадных автогонок, разработанная компанией Konami и выпущенная в виде

    Read more »
  • ZX-Spectrum 48k

    Неизвестный Синклер

    Весьма занимательное чтиво об истории становления компьютера ZX-Spectrum, Клайве Синклере и компании Sinclair Research. Цветной,

    Read more »
  • King Valley

    King’s Valley на ZX-Spectrum

    Моя версия игры King’s Valley для ZX-Spectrum, которую я написал еще в школьные годы, аккурат

    Read more »
  • YouCompleteMe in action

    Рандомные тормоза Vim с плагином YouCompleteMe

    Пользуюсь для C/C++ комплитером YouCompleteMe, базирующемся на clang. Периодически YCM тормозил так сильно, что ввод

    Read more »
  • Simple Viewer GL

    Simple Viewer GL

    Небольшой вьювер изображений использующий OpenGL. Пользуюсь этим вьювером в повседневной работе для быстрого просмотра списка

    Read more »
  • Rubik's Stopwatch

    Rubik’s cube Stop-watch

    Таймер для учёта времени сборки кубика Рубика и прочих головоломок. Более подробно о возможностях таймера

    Read more »

Dance Hero: Swipe to Dance

Dance Hero: Swipe to Dance

Гиперказуальная игра от Diesel Puppet для iOS и Android. Задача игрока рисовать гестуры которые присутствуют в левой колонке каждой волны. Делать это нужно быстро, т.к. список с пиктограммами гестур движется вниз. В игре есть магазин, в котором игрок может разблокировать различные танцы. На данный момент есть 10 вариантов танца, и все они чудесны по-своему. Мне очень нравятся анимации персонажа.

Я участвовал в разработке игры в качестве программиста. Идея игры, графика, Spine-анимации и баланс – все делалось командой Diesel Puppet. Игра делалась на моем кроссплатформенном движке AGE.

Вначале для распознавания гестур я использовал нейросеть. В качестве «движка» я применил открытый GRT. Но добиться высокой точности распознавания мне не удалось, хотя я и потратил много времени на обучение сетки. Вероятно мой кунг-фу далек от мастерства.

В итоге я полностью отказался от нейросетки и воспользовался алгоритмом $P+ с небольшими доработками. Доработки касались минимизации ложных распознаваний и не затронули сам принцип. Стоит заметить, что этот алгоритм работает весьма шустро и не требует длительного обучения. Достаточно лишь описать гестуры в математическом виде.

Для разработки уровней и балансировки геймплея была сделана веб-версия, а конфиг грузился с сервера. В релизной версии эта функциональность была отключена.

Версия для iOS

Версия для Android

Updating all git submodules at once

Со временем у меня собралось много игрового кода, который используется во множестве игр. Что бы не заниматься копипастом из проекта в проект, мучительно вспоминая, где же более «свежая» версия (т.к. дата не является признаком самой свеже реализации), я вынес все нужное во внешние модули. Процесс переноса кода во внешние модули длится до сих пор, т.к. появляются новые решения, которым самое место в отдельном модуле.

И вот обновление модулей в проекте у меня выглядело как-то так:

$ cd third-party/module_1 ; git pull ; cd -
$ cd third-party/module_2 ; git pull ; cd -
$ # ...
$ cd third-party/module_n ; git pull ; cd -

Что порой очень утомляло. В итоге лень победила и я открыл для себя новую команду:

$ git submodule foreach git pull origin master

WebAssembly

Для поддержки wasm нужно добавить в файл .htaccess следующее:

AddType application/wasm .wasm
AddOutputFilterByType DEFLATE application/wasm

Что избавит нас от сообщений об ошибке в логе. Но это несколько повысит нагрузку на сервер, ведь ему придется на каждый запрос паковать .wasm

Что бы снизить нагрузку на веб-сервер, стоит сделать так:

Options Multiviews
RemoveType .gz
AddEncoding x-gzip .gz
AddType application/wasm .wasm

А .wasm запаковать заранее:

$ gzip File.wasm

WordPress Block Editor problem

С обновлением до версии 5.x, редактор WordPress перестал работать. Кнопка (+) редактора неактивна. Проблема оказалась известная, но с выходом обновлений WordPress она так и не решалась. В теме на официальном сайте предлагается добавить следующий код в файл functions.php текущей темы.

function richedit_wp_cloudfront () {
   add_filter('user_can_richedit','__return_true');
}
add_action( 'init', 'richedit_wp_cloudfront', 9 );

Очевидно, что это не решение, а корявый костыль. А лучшим решением будет поставить старую версию редактора в виде плагина или дождаться официального фикса.

Локальное тестирование Facebook Instant Games

Facebook Instant Games Для тестирования игры для платформы Facebook Instant Games есть несколько вариантов:
– Создание тестовой версии продукта в контрольной панели.
– Тестирование локально, без необходимости загрузки игры на сервер Facebook.

Я использую оба варианта. Второй вариант использую гораздо реже и потому каждый раз приходится вспоминать как настроить окружение.

Подробности и иструкция на официальной странице – Testing, Publishing, and Sharing an Instant Game.

JavaScript string length

В веб-версии моего http-загрузчика обнаружилась проблема – длина responseText отличается от реального размера файла. Оказалось, что файл содержал русскую строку текста в utf-8. А я размер получал как responseText.length – длина строки в символах, но не байтах.

Проблема решилась просто – используем Blob:

let size = new Blob([this.responseText]).size;

MySQL: Insert or Update

Есть отличный проект Nakama https://heroiclabs.com но я продолжаю использовать свою реализацию Leaderboards и Profile Storage.

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

'INSERT INTO `some_table`' +
' (`user_id`, `timestamp`, `user_name`, `score`)' +
' VALUES(?, NOW(), ?, ?)' +
' ON DUPLICATE KEY UPDATE' +
' `timestamp`=NOW(), `user_name`=?,' +
' `score`=GREATEST(`score`, VALUES(`score`))';

Для работы этого запроса поле `user_id` должно быть UNIQUE.

Android NDK native APIs

Постоянно забываю какой API level какому Android относится.
Сводня табличка по стабильным версиям API NDK.
И что бы два раза не вставать – заметки по SDK platform, а заодно и ассеты Android.
Долгое время я использовал API 16, что соответствует Android 4.1 и Android 4.1.1. Сегодня решил в одной игре перейти на API 21. Перед публикацией посмотрю статистику количества отвалившихся пользователей этой игры из-за переходя на новую версию API.

Книга «Шаблоны игрового программирования»

Шаблоны игрового программирования Перевод книги Game Programming Patterns by Robert Nystrom. Книга была создана для удобного чтения на русском языке в формате электронной книги.

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

Краткий список шаблонов, которые рассмотрены в книге: Command, Flyweight, Observer, Prototype, Singleton, State, Component, Event Queue и прочее.

На сайте автора http://gameprogrammingpatterns.com/ можно заказать печатную или электронную версию книги на английском языке.

1 2 3 72