У меня есть базовый интерфейс ядра под названием IComponent.
public interface IComponent
{
void Initialize();
void Update();
void Draw(Color tint);
BoundingBox BoundingBox { get; }
bool Initialized { get; }
}
Он используется любым классом, который будет отображаться (кнопка, текст, текстура, ...)
Я хочуразработать набор эффектов, которые можно применить к любому IComponent, например:
Shake(IComponent component, TimeSpan duration)
-> Вызывает вибрацию компонента в течение заданной продолжительности.Он работает, изначально сохраняя центральное положение переданного компонента и смещая его при каждом обновлении до окончания периода.
Translate(IComponent component, Vector2 destination, TimeSpan timeToReach)
-> Заставляет компонент перемещаться в указанное место назначения через определенное время.Он работает путем постепенного смещения компонента при каждом обновлении.
Вы можете представить себе больше ...
Итак, предположим, что я хочу, чтобы определенный класс (Texture: IComponent) встряхивал при перемещении к определенномуточка.Я подумал о возможном использовании шаблона декоратора следующим образом:
Создать текстуру => Обернуть ее встряхиванием (продолжительность 5 секунд) => Обернуть ее переводчиком (продолжительность 10 секунд)
но есть некоторые проблемы с этим.
Прежде всего, обертка Shake прекрасно работала бы в одиночку со статической стационарной текстурой, но в сочетании с Translate она не работала бы, поскольку продолжала возвращать текстуру в исходное положение, и онане будет правильно переводить.
Во-вторых, хотя перевод займет 10 секунд, вибрация займет всего 5 секунд, поэтому впоследствии я не знаю, как автоматически удалить упаковку Shake изнутри цепи, ии, наконец, удалите Translate, когда все будет готово, оставив после себя оригинальную текстуру.
В-третьих, шаблон декоратора скрывает любые специфические функции обернутого объекта, поэтому после обертывания текстуры с помощью Shake я не смогу вызватьsetPixelColor () для Texture, если только я не создаю вторую прямую ссылкуПеред тем, как обернуть текстуру, добавьте текстуру.
Приветствуются любые предложения о том, как элегантно справиться с такой задачей.Спасибо.
Примечание : На практике я могу применить эти эффекты, вероятно, к 2% всех созданных объектов, которые являются IComponent.