43 lines
3.3 KiB
Markdown
43 lines
3.3 KiB
Markdown
# Аватары из PNG-слоёв
|
||
|
||
`avatar_layers` — рабочая реализация `IAvatarRenderer` с идентификатором `layers`.
|
||
Контентный мод зависит от `avatar_layers>=1`, объявляет сущность `Kind: avatar` с
|
||
`Renderer: layers` и кладёт прозрачные PNG в свою папку `avatar_layers/`.
|
||
|
||
[Полный формат и пример ресурса](en.md).
|
||
|
||
## Привязки пресетов
|
||
|
||
- `canvas`: объект `Width`, `Height`, по умолчанию 512×1024 логических пикселя.
|
||
- `layers/<id>`: путь к PNG с расширением, либо объект настройки слоя.
|
||
- `null` вместо слоя удаляет его из изображения.
|
||
|
||
Объект слоя содержит `Image`, `Order`, `X`, `Y`, `Width`, `Height`, `Visible`,
|
||
`Opacity`, `FlipH`, `FlipV`. Нулевые размеры означают размер холста. Для вырезанных
|
||
фрагментов задавай прямоугольник явно; для слоёв одинакового холста достаточно пути.
|
||
Порядок отрисовки — по `Order`, при равенстве по ID слоя. Более поздний слой выше.
|
||
Неизвестные свойства, отсутствующие PNG и неверные размеры отклоняются.
|
||
|
||
```csharp
|
||
IAvatar avatar = AvatarCatalog.Create("my_content/marao");
|
||
IAvatarRenderer renderer = AvatarRenderers.Create(avatar);
|
||
host.AddChild(renderer.View);
|
||
avatar.ApplyPresets(new Dictionary<string, string> { ["eyes_state"] = "closed" });
|
||
renderer.Apply(avatar.Resolve());
|
||
// До уничтожения host или выгрузки мода:
|
||
renderer.Dispose();
|
||
```
|
||
|
||
Пресеты переключают картинки дискретно, даже если передано время перехода.
|
||
Положение, прозрачность и отражение также задаются целевым состоянием.
|
||
Плавные деформации, маски, анимации моргания и интеграция с диалогами пока не реализованы.
|
||
|
||
Рендерер переиспользует неизменившиеся PNG и освобождает ненужные текстуры после
|
||
удаления старых узлов. Ошибочное визуальное состояние не заменяет предыдущее.
|
||
Логическое состояние аватара хранится отдельно. Владелец явно применяет изменения
|
||
и освобождает рендерер. Все визуальные операции выполняются на главном потоке Godot.
|
||
|
||
Тестовый набор `--itest=avatar_layers_contracts` содержит синтетические PNG и проверяет
|
||
настоящую отрисовку по цветам пикселей, переключение пресетов и освобождение ресурсов.
|
||
Для пиксельных проверок нужен оконный рендерер. В обычной игре тестовые ресурсы не загружаются.
|