ECW DevLog #5. Всё ещё онё уеё афё ооё

Добавление адекватных механизмов потребовало нормального такого рефакторинга одного класса... А результат тот же:

Рис. 1.

1. Цель

Получить инструменты для настройки анимаций интерфейса. Чтобы можно было писать такие конструкции:

* True define of anim opacity = 0.4, 500ms hover{ 1.0, quad, 200ms } }

2. Парсинг

Пришлось переписать процесс разбора файла. Зато сам процесс стал более пакетным и тривиальным. Было:

const auto& ci = props.extract( "#image" ); const auto& cl = props.extract( "#kimg" ); if( !ci.empty() || !cl.empty() ){ auto image = mSTR( ci.get( (const char*)( 0 ) ) ); auto kimg = mSTR( cl.get( (const char*)( 0 ) ) ); // ~~ Filling static data m_img.SetKeyImage( image ); // -- Statization if( cl.empty() ){ m_img.Set( m_img.STATIC ); } // ~~ Storing keys SetMyField( "#image", image ); SetMyField( "#kimg", kimg ); m_flg.Set( this->IMAGE ); }

Стало:

PSC_EXTRACT( cf, "#texture" ){ auto c = cf.get<color>( "#color", color( 0xffffffff ) ); if( c ) m_ins_tex.SetColor( c ); m_ins_tex.SetTexture( _read_prop<t_skey>( "#texture", 0, cf, INS_TEXTURE, PROP_TEXTURE ) ); Set( this->TEXTURE ); }

3. Унификация анимируемых свойств

Выглядит страшно, зато эта часть кода произведёт пересчёт анимации для любого float-значения (прозрачность, яркость, смещение по одной координате и т.п.):

for( const auto& g : anims[ANIM_FLOAT] ){ auto t = _form_data_target( g.anims, cur_state ); switch( g.prop ){ case PROP_OPACITY: p_context_current->GetField( mk( this, g.ins, g.prop ), ins[g.ins].opacity ); p_context_current->SetField( mk( this, g.ins, g.prop ), _mix_float( ins[g.ins].opacity, t, _progress(elapsed,t) ) ); break; default: APP_WARN( "Unrealized prop anim = [%u]", g.prop ); } }

4. Каскад свойств

Теоретически, теперь есть механизмы каскадного смешивания глобальных свойств (в основном всё, что связано с цветом).

5. Проблема состояния закрытия элемента UI

Если по конфигурации набросаны разные анимации с разным таймингом, для окна интерфейса это становится проблемой: сколько времени ему ещё висеть и ждать, пока дети поиграют? Теперь, вроде, тоже сделано.

6. Оптимизация по флагам

А это не сделал, апхапхапх

А ещё вся эта пое*авшая система может в подстановку значений, так что пойду писать теперь парсер для конфигурации сцен для диалогов. Будет что-то в духе:

house_scene{ background{ image{ "house.dds" } textblock{ style{ house_style } } }
2