Oxygine - это кроссплатформенный 2D фреймворк/движок для С++.
В его основе находится высокоуровневый Scene Graph, позволяющий заранее "создать и забыть" объект на экране, не возвращаясь более к нему, например, код ниже создает на экране спрайт, запускается его покадровую зацикленную анимацию и двигает объект, дополнительно обрабатывая по нему клик мышкой.
//создание спрайта на экране spSprite sprite = new Sprite(); sprite->attachTo( getStage( )); sprite->setScale( 0.5f); //запускаем по кадровую анимацию sprite->addTween( TweenAnim( gameResources.getResAnim( "anim")), duration, loops)); //запускаем движение спрайта sprite->addTween( Sprite::TweenPosition( x, y), duration, loops)); //обработка событи клика по спрайту sprite->addEventListener( TouchEvent::CLICK, clickHandler);
- Windows
- Linux
- Mac Os X
- iOS
- Android
- HTML5 (via Emscripten)
- аккуратная модель обработки событий/нажатий, взятая полностью из Flash/ActionScript3
- система для анимации спрайтов (Tweening)
- встроенные инструменты для отладки SceneGraph
- высокая производительность
- сборка на основе SDL2 или Marmalade
- свободное использование, исходный код открыт под лицензией MIT
Сайт: https://oxygine.org
Твиттер: https://twitter.com/oxygine2d
Вики документация: https://bitbucket.org/oxygine/oxygine-framework/wiki/Home
Скачать SDK: https://oxygine.org/download.php
Маленькая предыстория, зачем мне надо было делать это?
• Язык программирования C++.
• Для отрисовки используется чистый OpenGL(ES) 2. Поддержка шейдеров. Поддержка сжатых текстур.
• Запуск прямо из браузера с помощью Emscripten
• Компонентная система, простой и предсказуемый ООП API. Возможность наследоваться от классов и переопределять их поведение.
• Нет глобальных мега менеджеров всего и вся, навязывающих свои требования к написанию кода.
• Эффективная и гибкая работа с ресурсами, максимально приближенная к вашей игре.
• Компоненты движка слабо связаны между собой.
Их можно использовать вместе, раздельно или не использовать вовсе.
• Быстрое создание/удаление объектов, используются memory pools для всех объектов движка.
• Scene Graph построен на умных указателях (аналогия boost::intrusive_ptr).
Можно не мучиться с удалением объектов и порчей памяти, но иногда надо разруливать циклические ссылки (или не делать их).
Scene Graph чем-то похож на Flash. (картинки со схемой наследования 1, 2)
Если вы желаете использовать свой Scene Graph, то от Oxygine можно взять низкоуровневую систему вывода изображений.
• Debug Tools. Tree Inspector - визуальный "профайлер" для Scene Graph, где можно прямо в игре исследовать граф и различные его узлы для анализа и поиска ошибок. Textures Inspector - анализ загруженных текстур.
screenshot
• Рендер в текстуру.
• Описание ресурсов хранится в xml файле. В нем довольно много различных опций: можно добавлять свои типы ресурсов, можно указывать формат, в котором нужно хранить текстуру (атлас) в памяти, количество строк/столбцов для анимации и т.д. Любой ресурс может иметь дополнительные user-data атрибуты.
• Есть Tweens для по-кадровой анимации, цвета, позиции, поворотов и т.д., можно легко добавлять свои.
Есть очереди из Tweens. Различные easing.
• Набор базовых UI компонентов часто используемых в играх: Button, Sprite, ProgressBar и другие.
• command-line утилита на Python для обработки ресурсов, которая умеет:
- собирать ваши ресурсы из xml файлов в атласы, подбирая оптимальный размер атласов.
- сжимать атласы в нужный формат текстур (ETC, PVRTC)
- ресайзить ассеты из высокого разрешения в необходимое для игры
- Выполняет дополнительную работу, которая оптимизирует работу с ресурсами в игре.
• Продуманная обработка событий от мышки или multi touch касаний.
Можете, например, двумя пальцами зажать две кнопки на экране одновременно и без коллизий.
• Различным обработчикам событий (или твинам) можно задавать коллбеки на основе Winnie.Closure.
• Есть возможность работать с кодом и различными диалогами в блокирующем стиле (concurency programming/coroutines/сопрограммы) (пример).
• Аккуратный и точный рендеринг текста с поддержкой переносов строк, различного вертикального и горизонтального выравнивания текста, поддержка локализации, utf-8. Поддержка html тегов (screenshot).
Поддержка стилей текста.
• Если вы хотите поддерживать несколько наборов графики для разных разрешений игры, например 480x320 и 960x640, то это можно сделать на уровне движка, добавив всего лишь пару строк кода.
Вам не придется подстраивать координаты объектов вручную под другое разрешение экрана. Достаточно хранить исходный арт в высоком разрешении.
• Сборка в атласы на лету во время загрузки ресурсов, если вы не сделали это в заранее.
• Многопоточная загрузка ресурсов.
• Можно «частично» выгружать из памяти тяжелые ресурсы, например, такие как атласы.
Сам хендл ресурса с атласом останется валидным (как и его размеры) и даже будет указатель на текстуру, но сама текстура внутри будет пустой.
Это актуально и удобно, если есть жесткие ограничения по памяти: например, если создали весь UI заранее с полу загруженными/выгруженными ресурсами, но пока нет (или уже нет) надобности их отображать.
• Быстрый автоматический батчинг.
• Поддержка различных шейдерных эффектов. Поддержка масок.
• Растровые шрифты на основе BMFont. Есть возможность добавить свой тип шрифта.
И это еще не все. Возможностей очень много, но использовать их не сложно, фреймворк совсем не монструозный и интуитивно понятный. Пары просмотренных примеров достаточно, чтоб уже разобраться с основными принципами его работы.
Скомпилировать фреймворк можно на базе SDL2 или Marmalade.
Где от платформы берется только самый низкий уровень: инициализация приложения, ввод/вывод, opengl и тд.
Примеры кода для общего представления.
//create sprite and display it //создание спрайта на экране spSprite sprite = new Sprite(); sprite->setResAnim( gameResources.getResAnim( "anim")); sprite->attachTo( getRoot( )); sprite->setScale( 0.5f); //run animation tween //запускаем твин по кадровой анимации sprite->addTween( TweenAnim( gameResources.getResAnim( "anim2")), duration, loops)); //run position tween //запускаем твин позиции sprite->addTween( Sprite::TweenPosition( x, y), duration, loops)); //handle events //обработка событий sprite->addEventListener( TouchEvent::CLICK, CLOSURE( this, &someClass::onClick)); //short syntax example //сокращенный синтаксис sprite = initActor( new Sprite, arg_resAnim = gameResources.getResAnim( "plus"), arg_scale = 0.5f, arg_onClick = CLOSURE( this, &HUD::clicked), arg_pos = Vector2( 70, 55), arg_attachTo = getRoot( ));
Frankinshtein
огромный респект, пугает только мармеладная основа.
Думаю имеет смысл делать движок уже на основе чистого Опенгла.
А вообще всё выглядит очень-очень вкусно) надеюсь не забросите поддержку движка
> Еще один движок-обертка над OpenGL/D3D API скажете вы? Нет, это совсем не обертка, это
это обертка над Marmalade-ом, который кстати не бесплатный.
> Изначально разрабатывался для мобильных платформ
В чем заслуга, собственно, мармелада...
В остальном вроде всё норм.
ASD
D@eMonD
Я же написал, что он умеет работать еще под Cocos2dx, но мармелад реально удобная штука и от него не хочется отказываться.
апнем:)
Frankinshtein
> апнем:)
А кому может понадобиться этот ( любой другой молодой ) движок? Всмысле движки однозначно нужны. Но у всех они есть. У кого-то хорошие, у кого-то плохие... И вот так просто взять и пересесть на другой - это надо иметь смелость. А тут еще движок только недавно плявился, т.е. непонятно какие в нем косяки есть и непонятно, что с движком будет в дальнейшем.
Ну и это, у мармелада есть явные минусы. Мак и ПС в бете. Закрытый код ( т.е. встроить IOS апи от тогоже фиша не получится. )
andrey.mesheryakov
> Но у всех они есть
И у каждого - свой:-D
А делать закрытый двиг на и без того закрытой платформе...
>>А кому может понадобиться этот ( любой другой молодой ) движок?
я написал кому нужны в самом верху поста на своем примере.
Есть С++ альтернативы с таким набором фич?
>>Ну и это, у мармелада есть явные минусы.
>>А делать закрытый двиг на и без того закрытой платформе...
выделил жирным, что кроме закрытого мармелада есть еще и поддержка открытого кокоса
Frankinshtein
> я написал кому нужны в самом верху поста на своем примере.
> Есть С++ альтернативы с таким набором фичей?
Вроде как нету.
Но я не совсем уловил как ты ( ничего же, что я на ты? ) видишь применение своего движка другими людьми?
Покупка лицензии и саппорта?
И такой вопрос - движок же использует gles1.1. T.е. что там от самого мармелада? Ивенты всякие и билд-систем? Т.е. может быть есть смысл написать все полностью своё? Без мармелада? Если нет - почему?
>>Но я не совсем уловил как ты ( ничего же, что я на ты? ) видишь применение своего движка другими людьми? Покупка лицензии и саппорта?
сейчас все безвозмездно даже саппорт, сначало нужно некоторое портфолио и комьюнити движка, а потом я подумаю, как сделать лучше
>>И такой вопрос - движок же использует gles1.1. T.е. что там от самого мармелада? Ивенты всякие и билд-систем?
верно, от мармелада билд система, инициализация и эвенты
>> Т.е. может быть есть смысл написать все полностью своё? Без мармелада? Если нет - почему?
напомню что есть еще поддержка кокоса:)
смысл сделать свое есть, но это огромная работа. За iOS я не переживаю, но поддерживать весь зоопарк Андроидов довольно тяжело с учетом различных проблем в АПИ
обновил билд:
- улучшена обработка событий
- улучшен профайлинг утечек
- добавлен DragHandler. С помощью него можно легко сделать перетаскивание объектов. Причем даже если перетаскиваемый актер (или кто-то выше из его родителей) имеет необычную трасформацию (есть вращения, растяжение и тд), то перетаскивание будет работать корректно
схема наследования классов входящих в Scene Graph
Modal, ого новая сущность http://ru.wikipedia.org/wiki/Модал
Тема в архиве.