Посмотреть демо можно здесь: https://ubgamez.ru/graph2d/game.html (откроется в браузере) Моя C++ либа для 2D-игр: scene graph, HTML-UI, свет и запеченный Spine Короче, здорово, аноны. Давно собирался показать, какую хуйню я пилю в свободное время, когда не надо впахивать на галере. Это кастомная библиотека для 2D-игр на плюсах. Из фич: древовидный scene graph, рендер через один батч-конвейер, HTML-рендерер для UI (чтобы не ебаться с рантайм-версткой), нормальный свет и, сука, запеченные Spine-анимации. Код выкачу в ближайшее время под MIT — вместе с демкой, из которой надергал примеры ниже. [SceneGraph] Каждый объект — это CContainer. Внутри зашито всё: позиция, скейл, поворот, пивот, альфа, tint, скролл-бокс, твины и дочерние элементы. Трансформа наследуется по дереву, рендер хуярит строго в порядке детей, а z-order — это просто их индекс в массиве. Спрайт, лейбл, HTML-документ, партиклы, Spine, диалог — всё это ноды одного дерева с единым интерфейсом. auto ptrHero = std::make_shared ptrHero->addChild(ptrShadow); ptrHero->addChild(ptrBody); // тень под телом // z-order — просто порядок детей ptrHero->swapChildren(ptrShadow, ptrBody); ptrHero->bringChildToFront(ptrBody); dialog->bringChildUnderForeground(ptrPanel); // вспышка удара: твин тинта ptrBody->addSelfTween(eTweenProp::BLACKEN, 1.f, 0.2f, 0.1f, Easing::linear); ptrBody->addSelfTween(eTweenProp::BLACKEN, 0.f, 1.0f, 0.6f, Easing::outQuad, 0.1f); Если надо, чтобы лейбл намертво привязался к спине персонажа и двигался вместе с ним — делаешь addChild() и вообще не паришь мозг, он будет кататься, крутиться и скейлиться за родителем. Из коробки завез каскадную упаковку детей с переносом строк и выравниванием, drag & drop и таймеры через тот же твинер, чтоб не городить велосипеды. _ptrParticlesDemo->packChildrenCascade(maxCx, maxCy, 7.f, true); btnsCont->alignChildren(eChildrenAlign::HORIZONTAL, 20.f, getDialogCx()); // drag & drop ptrFace->setInteractive(true); ptrFace->setDragable({}, [](CContainerPtr, float, float) { return true; }); ph->setInteractive(true); ph->setOnDragDropAccept([](CContainerPtr dropped) { return true; }); ph->setOnDragDropped([](float x, float y, CContainerPtr dropped) { dropped->setPos(0, 0); ph->addChild(dropped); // карта стала ребёнком слота }); ------------------------------ [Диалоговая_система] BaseDialog — нода дерева со стеком модальных окон, стилями закрытия и жизненным циклом. auto dlg = std::make_shared dlg->setTitle("Настройки", ptrTitleSprite, 113, 113); dlg->createCloseButton(ptrNormal, ptrPressed, ptrHover, ptrDisabled); dlg->createFgLayer(ptrFg, 60, 60, 46, 46); // рамка поверх контента // модально: захватывает ввод, скрывает предыдущее окно стека dlg->open(this { refreshHud(); }); // колбэк после закрытия Режимы жизни: open() — модальное окно со стеком; showAsPanel() — панель внутри родительского диалога, ввод не блокирует; закрытие по крестику, по колбэку или CLICK_ANYWHERE — когда кликаешь мимо окна. На коленке собран встроенный скролл: скроллбар, тени, физика флинга с «оттяжкой» за краем и возвратом обратно, колесо мыши и drag-скролл — работает сразу без допила напильником. ------------------------------ [HTML_внутри_сцены] UI — это просто HTML-документ, который прикидывается нодой дерева. Таблицы, ссылки, чекбоксы, слайдеры, прогрессбары, комбобоксы с выпадашкой, nine/three-slice, картинки с дефолтными эффектами (glare, glitch, пикселизация…) и даже тег _ptrAboutDemo->init(R"HTML(....)HTML", cx - 40, cy, shared_from_this()); // клик по ссылке копирует в буфер (через Emscripten) auto* dom = HTMLDom::getInstance(); dom->setOnClick(dom->findNodeIdByAttr(0, "id", "tg_link"), [](unsigned long long, float x, float y, int) { copyToClipboard("@ubgamez"); showCopyToast(x, y); }); ------------------------------ [Запеченный Spine: в десятки раз быстрее] Если выкатить дефолтный Runtime-Spine на сотню юнитов, он просто трахнет CPU в кашу из-за костей, мешей и клатчинга. Поэтому анимации можно запечь оффлайн в компактный бинарник — позиции жмутся в int16, UV в uint16, альфа и blend — в один байт. В рантайме движок просто один раз проходится по статическому буферу с интерполяцией кадров: ptrSpine->loadPackedAnimation(0, "BBB/barbarian_idle.panm", 1, true, ptrTex); ptrSpine->setAnimationByTag(1); Никакой тяжелой костной математики в кадре — можно спавнить десятки спинов на сцене, fps не просядет. При этом Runtime-режим никуда не делся: если нужны события анимации и хитбоксы — дергаешь обычный API. Оба режима спокойно уживаются вместе. ------------------------------ [Свет прибитый к Spine] Движок держит до 204 источников в uniform-блоке на кадр, куллинг слоев идет прямо в шейдере. Но самая сочная фича — привязка света к самому скелету: // аттачмент сам светит: фонарь из картинки фонаря _ptrLamp->setLightAttachment("light", true); _ptrLamp->setLightAttachment("lightspot", true); // радиальный свет на кости ptrHero->addRadialLight(300.f, "hand_bone", "torch_slot", 1.5f); Для отмеченного аттачмента рендерер каждый кадр строит квад спрайта в экранных координатах и кидает в световую таблицу — фрагмент шейпится UV аттачмента, яркость умножается на альфу слота. Факел машет — пятно света гуляет по стенам ровно так, как его нарисовал аниматор. Светят и runtime-, и запеченные спины. На том же конвейере крутятся bloom, виньетка, «капли на стекле», зерно, аберрация и fish-eye. Если интенсивность эффекта на нуле — ветка в шейдере полностью отключается, так что на слабом говне мамонта тяжелые постэффекты не будут жрать ресурсы.
>Анончик, я зашёл посмотрел две чаечки тебе, анонче >Непонятно вот что: что тут нового? В чём новизна? простота использования + скорость на слабых девайсах граф и диалоговая система с поддержкой HTML рендера - 'это просто спасение для мобило, где тонны интерфейса.
Запеченные Spine анимашки - вообще отрыв башки, производительно буквально в 20 раз выше обычно спайна, там где спайн пукнет на 10 инстансах, тут можно наспавни сотни и оно будет работать приемлемо даже на слабом устройстве. >проективную каво? >Я тоже пишу свой движок, 3D, с удобным управлением конвеером, для компоновки ежей с ужами бесшовной @ьанкей потек походу
>>1109819 >>Непонятно вот что: что тут нового? В чём новизна? >простота использования + скорость на слабых девайсах
Простота имеет обратную сторону, а 2D любые "слабые" девайсы тянут сейчас (ебанись ты слабым называешь вращение текстуры, нихуя себе!)
>граф и диалоговая система с поддержкой HTML рендера - 'это просто спасение для мобило, где тонны интерфейса.
Тупик: всех HTML-ёбов порешает webasm. И опять см. ремарку про слабые девайсы
>Запеченные Spine анимашки - вообще отрыв башки, производительно буквально в 20 раз выше обычно спайна, там где спайн пукнет на 10 инстансах, тут можно наспавни сотни и оно будет работать приемлемо даже на слабом устройстве.
Чудеса, не верю. Откуда выигрыш? Я ковырял рендер сплайна в С++, даже багу там пофиксил - нету там принципиальных проблем сперформансом
>>проективную >каво?
спроси у дипсика что такое "проективная геометрия", ёпта
>>Я тоже пишу свой движок, 3D, с удобным управлением конвеером, для компоновки ежей с ужами бесшовной >@ьанкей потек походу
>>1109822 >ты слабым называешь вращение текстуры купи себе нормальную нейронку уже. >Тупик: всех HTML-ёбов порешает webasm каво? HTML именно рендерится, понимаешь? нет ? >не верю верю, не верю, открывай демку да смотри, йопт. открывается прямо в браузере
>>1109801 (OP) АНАНАСИКИ, ЕСЛИ ВЫ ИЩИТЕ ПЕРФУ ТУТ ОНА НА УРОВНЕ. ОСОБЕННО ЭТО КАСАЕТСЯ ЗАПЕЧЕННОГО SPINE ПОСМОТРЕТЬ МОЖНО В "ВОЗМОЖНОСТИ ДВИЖКА" пункт "Baked Spine"
Зачем кому-то твой движок, особенно в эпоху LLM. Делай движок для себя. Делай игры для конкурсов на своем движке, например. Если хочется поделиться, пости скриншоты в субшоте или движкосраче. Например, в духе "мои анимации spine в 10 раз быстрее годота!", чтобы годоти злились.
>>1109823 >>ты слабым называешь вращение текстуры >купи себе нормальную нейронку уже. >>Тупик: всех HTML-ёбов порешает webasm >каво? HTML именно рендерится, понимаешь? нет ? >>не верю >верю, не верю, открывай демку да смотри, йопт. открывается прямо в браузере
Тебе лет 20 что ли? будто детский сад
слабость железа имелась ввиду. слабая была NES, например - там плавучки не было
>>1109801 (OP) >Двиг >Либа Так что в конечном итоге? Либадвиг? Или больше двиголиба? >>1109825 >я на нем релиз еще до гпт. Покажи по брацки, хотябы видосик какой >ОСОБЕННО ЭТО КАСАЕТСЯ ЗАПЕЧЕННОГО SPINE ПОСМОТРЕТЬ МОЖНО В "ВОЗМОЖНОСТИ ДВИЖКА Маловато. Хороший вопрос, много ли вообще анонов на борде которые спайн хотябы трогали
>>1109871 >Так что в конечном итоге? ну скорее либа. от двигла ждут редактора, у меня его нет, но можно спайн использовать в качестве редактора. >Покажи по брацки, хотябы видосик какой Ну вот такую хуйню релизили на ок, заработали 89 рублей Разработка шла в донейронные времена, поэтому потратили несколько лет (рисовка, анимации, код, 20+ героев)
>>1109873 >Ну вот такую хуйню релизили на ок, заработали 89 рублей >Разработка шла в донейронные времена, поэтому потратили несколько лет (рисовка, анимации, код, 20+ героев) Пиздец
>>1109917 >Почему весь софт для 2D анимаций либо платно, либо заброшенный? Ну мохнатый пиратится изично, да и в юнити и в годоте есть более менее приличный костевой аниматор
>>1109921 >Только если ты не планируешь никуда релизиться. Я говорю за moho - он экспортит считай 3д модели с ригами. Там нечего детектить на пиратство
>>1109928 ты меня со своим ебырем перепутал. я не из твоей гомотусовочки и ваш лгбт-френдли слэнг понимать не обязан. так что за забирай свою "плавучку" и не забудь завалить ебучку.
>>1109928 Ананасик, реально хз про что ты. Про флоты чтоль? Дак фпу дохуя где не было , не только на nes. Да и вообще не понятно почему ты про nes заговорил. У тебя точно все в порядке?