Войти
ПроектыФорумУтилиты

mlc-tools. Генератор + транслятор кода. C++, Python, PHP, Java Script

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 Следующая »
#0
8:03, 1 окт. 2017

Название: 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 (идет активная разработка)

В репозитории проекта лежат тесты, демонстрирующие возможности утилиты


#1
8:04, 1 окт. 2017

Пример конфига для генератора:

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
}

Генерация соответствующих классов:

+ Показать

#2
8:04, 1 окт. 2017

[Reserved]

#3
12:58, 1 окт. 2017
# include "Generics.h"

ошибка вылезет

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

Тут будет что то типа шаблона проекта ? типа категории - платформер, шутер, гонки - прога просто наколбасит кучу базовых классов по этим шаблонам?

#4
16:12, 2 окт. 2017

Если я правильно понял, то чем это лучше того же protobuf?

#5
19:10, 2 окт. 2017

Двойные подчёркивания в идентификаторах, говоришь.

#6
9:27, 5 окт. 2017

Развивай до полноценного метаязыка, будет круче :)

#7
9:38, 5 окт. 2017

gambit_oz
> Я немного не понял суть проекта. Вот например когда я начинаю делать игру. Я
> беру свой движок, открываю пустой проект с этим движком и начинаю кодить.
>
> Тут будет что то типа шаблона проекта ? типа категории - платформер, шутер,
> гонки - прога просто наколбасит кучу базовых классов по этим шаблонам?
Насколько я понял в проге ты задаешь простые шаблоны для классов а програ генерит для них бойлерплейт типа операторов, различных конструкторов и т.д., а так же кода для сериализации/десериализации в/из xml/json

#8
5:59, 29 дек. 2017

Madware
> Насколько я понял в проге ты задаешь простые шаблоны для классов а програ
> генерит для них бойлерплейт типа операторов, различных конструкторов и т.д.
Все верно. Сейчас утилита умеет генерировать 3 синтаксиса - cpp, php, python. На данном этапе из коробки только в основном сериализация.
В разработке - генерация не только базовых функций, но и трансляция с++ подобного кода в остальные поддерживаемые языки.

#9
15:53, 4 янв. 2018

Добавил пример использования на простой мини-игры:
Simple Dungeon Game Online (github)

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

Чем примечателен пример - весь код игровой логики, обрабатываемой на сервере написан на c++. Для запуска на сервере код транслируется в PHP или в Python, в зависимости на каком сервере запустить игру.
Игра работает на любом из серверов (тестировалось на OS X). Сами сервера не содержат игровой логики, к примеру PHP сервер:

Сервер на C++:

+ php

Сервер на PHP:

+ php

Сервер на Python:

+ python

Скриншот "Игры":

+ Показать

Пока выходных много - планирую написать более сложную реализацию этой же игры, с запусками на c++, php, python серверах.

#10
20:27, 4 янв. 2018

Добавил к игре С++ сервер

#11
21:10, 4 янв. 2018

так зверски оборачивать enum это постараться надо : )

а что за артефакты?

Volodar

>    if(value == "2") {_value = 2; return; };
#12
6:13, 5 янв. 2018

Sh.Tac.
> так зверски оборачивать enum это постараться надо : )
>
Хотелось, чтобы в xml/json, это выглядело как слово, а не цифра. После этого еще понял один крутой момент - система сообщений, когда сообщение может быть и обычный int и сложный класс, но все это дело просто сравнивается интами.

Sh.Tac.
> а что за артефакты?
Наследие старого кода. Изначально не мог подружить Python-код для нормальной десериализации, и он вместо слова, писал число. Пришлось вывертываться

#13
16:07, 23 фев. 2018

Возможно я не правильно понял , но это все умеет haxe из коробки, и даже больше. Куча поддерживаемых языков + куча платформ. Правда за основу там взят не cpp, а свой флешоподобный велосипед, собсно haxe. Но любой знающий cpp в нем легко разберется. Так зачем огород городить?

#14
8:24, 24 фев. 2018

Olaf85
Не знал о таком. Посмотрю. По описанию с https://ru.wikipedia.org/wiki/Haxe это не то, что мне нужно было.

Страницы: 1 2 Следующая »
ПроектыФорумУтилиты