ECW DevLog #8. Рефактор рефактора

Ещё один этап страдания. Мыслительный рефакторинг и закладка фундамента.

Рис. 1.

3. Что на гифке

Раньше это всё было красиво сделано, текст там выводился нормально и всё-такое. Зато сейчас это работает через класс UI::Scene, у которого функция отрисовки выглядит примерно так:

void UI::Scene::Render(){ Super::Render(); }

Всё, что на гифке рисуется - через UI::Scene! Хотя, конечно, обработку анимаций надо будет ещё налаживать, но какое-никакое ядро уже есть.

1. Файлы конфигураций

Произвёл рефакторинг в уме системы конфигов и кэширования. В будущем ещё буду проверять систему наследования (это чтобы многомиллиардное коммьюнити моей игры мечты могло создавать крутые моды). Там на самом деле сложно всё, ИИ мне про какие-то AST-деревья рассказывал.

best_game_of_the_games{ base = developer_soul // наследование в конфигах }

1.1. Коммонизация

В общем-то, всё, кроме GUI (ну, это системное), задаётся через текстовые JSON-style файлы. Соответственно, были реализованы различные механизмы кэширования самих файлов и объектов, которые из них создаются. Общая цепочка: файл -> конфиги[тип_сущности][токен_конфига].

Далее, можем либо закэшировать прототип объекта, создав его из конфига, либо создавать объекты напрямую из конфига, минуя прототипирование объекта.

2. Менеджер кэширования

В итоге, раскопал заготовку для менеджера кэширования. Ранее я на него забил, поскольку сложно, непонятно. Нужны шаблоны, связь между типом объекта и enum. Но с помощью ИИ разобрался. Оказалось, там ужё всё написано почти как надо. И теперь вместо где-попальных объявлений можно писать так:

SetDrawer( mCACHE.find<UI::Visual::Drawer>( mOPTS.getDefaultDrawerName( "ButtonDrawer" ) ) );

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

4. Задействованные файлы

4.1. Script

// ... #line -g sceneA -t :set sceneText -t:2000 A -t:2000 B -t:2000 C -t:2000 D -g sceneB -v :v #line YES :v #end NO // ...

4.2. Scenes

@snips{ dialoge{ #offset{ 800, 600 } #size{ .1, .1 } } } @scenes{ sceneA{ #decor{ scene } #image{ back3 } } sceneB{ #decor{ scene } #image{ back2dds } } sceneC{ #decor{ scene } #image{ back1 } } sceneText{ #decor{ sceneDialogePanel } #slot{ dialoge } } }

4.3. Drawer

sceneDialogePanel{ #timeout = 500; #opacity = .8, 500ms; #texture{ #texture = back1; } #label{ #font = candara20; #text = $text; } } scene{ #timeout = 500; #opacity = 1., 500ms; #texture{ #texture = $image; } }

Кстати, тут есть другой пост, там прикреплен важный опрос связанный с концепцией игры, очень хочется узнать ваше мнение!

1
1