Название: MLC-tools
Язык: Python
Команда: Я
Github: https://github.com/mlc-tools/mlc-tools
Представляю свою утилиту для генерации и трансляции единой кодовой базы, на другие языки
Обратите внимание - утилита используется только в игровых проектах, соответственно под них и заточена.
Цели:
- Одна кодовая база для клиента и сервера
- Генерация unit-test классов, проведение тестирования
- Сериализация данных, передача их по сети между клиентом и сервером
- Хранение данных игры
- Ускорение разработки
Основной список задач:
Общее:
- Опциональная генерация классов с несколькими форматами сериализации (xml, json)
- Подключение внешних фильтров для пропуска файлов при генерации
- Подключение внешнего генератора для модификации существующих классов и добавления новых
- Для с++ используется IntrusivePtr для подсчета ссылок
- Разделение кода на client/server стороны, также разделение по языкам.
- Запуск тестового скрипта при генерации
- Возможность определения класса как inline - этот класс не будет сгенерирован, но все классы, унаследованные от него, получат весь необходимый функционал.
- Для С++ - использование non-virtual методов по возможности.
- Генерация методов для паттерна Visitor
- Генерация Observable класса для паттерна слушатель
- Слабая поддержка исключений
Классы:
- Генерация классов
- Наследование (множественное наследование не поддерживается. Есть в планах)
- Ограничение доступа (public, protected, private)
- Абстрактные классы (интерфейсы)
- Сериализация
- Генерация интерфейсов для unit тестирования публичных функций класса
- Поддержка вложенных классов
Члены класса:
- Статические
- Константные
- Стандартные типы: int, float, string
- Массивы list<item>
- Словари map<key, value>
- Инициализация по умолчанию, заданным значением
- Рантайм данные (не сериализуемые)
- Ссылки на данные
Функции:
- Поддержка const модификаторов для C++
- Тело функций пишется на с++ с ограничениями
- Абстрактные функции
- Возможность объявление external функций при поддержке в языке (не поддерживается в PHP)
Перечисления (enum):
- поддерживаются функции для перечислений
- с++ - используется тип int, конвертация в string и обратно
- Python, PHP, JS - используется string
Данные:
- объединение всех xml, json в общий файл
- поддержка ссылок на данные
Пример простой игры:
Simple Dungeon Game Online (github)
Использование сторонних библиотек для с++ кода:
1. pugixml
2. jsoncpp
Цель создания темы - поделиться наработками с народом, надеюсь будет кому-то полезна утилита.
Цель создания утилиты - давно уже заметил, что часть разработки отводится под типичные задачи, получается много кода, который похож, но выполняет различные задачи. Тогда и решил сделать генератор для таких классов. Позже к нему была прикручена сериализация, поддержка нескольких классов и т.п. Все, что делает утилита - используется и было добавлено не просто так, а по необходимости.
Документацией утилита не обладает, собираюсь в ближайшее время заняться ей. А документировать уже есть много чего.
Использование:
В данный момент утилита используется в нескольких проектах:
- Мультиплеер: Travian-подобная стратегия (не завершено)
- Сингл-плеер: Текстовый квест, Tower Defense (не завершено)
- War Alert: Red Lords. Online RTS Android iOS.
- Dungeon RPG (идет активная разработка)
В репозитории проекта лежат тесты, демонстрирующие возможности утилиты
Пример конфига для генератора:
enum UnitType { attack defend support } class data/DataUnit<SerializedObject>:storage { string name UnitType unit_type VisualUnit visual DataUnit:link link_to_data list<DataUnit:link> all_units map<string, int> map_units }
Генерация соответствующих классов:
[Reserved]
# include "Generics.h"
ошибка вылезет
Я немного не понял суть проекта. Вот например когда я начинаю делать игру. Я беру свой движок, открываю пустой проект с этим движком и начинаю кодить.
Тут будет что то типа шаблона проекта ? типа категории - платформер, шутер, гонки - прога просто наколбасит кучу базовых классов по этим шаблонам?
Если я правильно понял, то чем это лучше того же protobuf?
Двойные подчёркивания в идентификаторах, говоришь.
Развивай до полноценного метаязыка, будет круче :)
gambit_oz
> Я немного не понял суть проекта. Вот например когда я начинаю делать игру. Я
> беру свой движок, открываю пустой проект с этим движком и начинаю кодить.
>
> Тут будет что то типа шаблона проекта ? типа категории - платформер, шутер,
> гонки - прога просто наколбасит кучу базовых классов по этим шаблонам?
Насколько я понял в проге ты задаешь простые шаблоны для классов а програ генерит для них бойлерплейт типа операторов, различных конструкторов и т.д., а так же кода для сериализации/десериализации в/из xml/json
Madware
> Насколько я понял в проге ты задаешь простые шаблоны для классов а програ
> генерит для них бойлерплейт типа операторов, различных конструкторов и т.д.
Все верно. Сейчас утилита умеет генерировать 3 синтаксиса - cpp, php, python. На данном этапе из коробки только в основном сериализация.
В разработке - генерация не только базовых функций, но и трансляция с++ подобного кода в остальные поддерживаемые языки.
Добавил пример использования на простой мини-игры:
Simple Dungeon Game Online (github)
В игре два действия - открыть ячейку уровня и собрать золото. Оба действия обрабатываются на сервере. Клиент выступает только в качестве показа содержимого и принятия ввода от пользователя.
Чем примечателен пример - весь код игровой логики, обрабатываемой на сервере написан на c++. Для запуска на сервере код транслируется в PHP или в Python, в зависимости на каком сервере запустить игру.
Игра работает на любом из серверов (тестировалось на OS X). Сами сервера не содержат игровой логики, к примеру PHP сервер:
Сервер на C++:
Сервер на PHP:
Сервер на Python:
Скриншот "Игры":
Пока выходных много - планирую написать более сложную реализацию этой же игры, с запусками на c++, php, python серверах.
Добавил к игре С++ сервер
так зверски оборачивать enum это постараться надо : )
а что за артефакты?
Volodar
> if(value == "2") {_value = 2; return; };
Sh.Tac.
> так зверски оборачивать enum это постараться надо : )
>
Хотелось, чтобы в xml/json, это выглядело как слово, а не цифра. После этого еще понял один крутой момент - система сообщений, когда сообщение может быть и обычный int и сложный класс, но все это дело просто сравнивается интами.
Sh.Tac.
> а что за артефакты?
Наследие старого кода. Изначально не мог подружить Python-код для нормальной десериализации, и он вместо слова, писал число. Пришлось вывертываться
Возможно я не правильно понял , но это все умеет haxe из коробки, и даже больше. Куча поддерживаемых языков + куча платформ. Правда за основу там взят не cpp, а свой флешоподобный велосипед, собсно haxe. Но любой знающий cpp в нем легко разберется. Так зачем огород городить?
Olaf85
Не знал о таком. Посмотрю. По описанию с https://ru.wikipedia.org/wiki/Haxe это не то, что мне нужно было.
Тема в архиве.