#c# #xna #draw
#c# #xna #рисовать
Вопрос:
У меня есть StatBarView
класс, который содержит a Stat
, int
именованный процент и два Color
s. В Update()
методе я плавно меняю процентное значение строки, насколько полной она должна быть. Далее у меня есть четыре Draw()
метода: один для рисования панели маленьким, один для среднего, один для большого и один для рисования его в виде текста, а не графически.
Это работает, но.. Я чувствую, что это станет беспорядком, если я захочу реализовать больше вариантов рисования.
Я мог бы превратить «текстовое представление» в собственное StatTextView
, но это только отодвигает проблему в другое место. Я также хочу избежать необходимости передавать все виды параметров в метод рисования, это заставило бы меня бегать повсюду, если я захочу изменить размеры нескольких вещей. Я также хотел бы избежать какого-либо массового метода с использованием операторов switch, который кажется еще хуже.
Я подумал о том, чтобы передать an IStatBarContext
, который имеет a Draw(int percentage)
, который будет работать, но кажется очень сложным. Должен ли я вызывать Stat.Draw(spriteBatch, position, new StatBarLarge())
на каждой итерации Draw()
? Это загрузка бесполезных новых объектов в секунду. Кроме того, new StatBarString()
этот процентный показатель не будет использоваться. Я думаю, что я где-то ошибся в своем дизайне.
Тем не менее, я не знаю, как на самом деле сделать этот код более чистым. Кто-нибудь мне поможет?
Ответ №1:
Похоже, ваш последний пример / выбор точен. У него даже есть имя, шаблон стратегии.
В версии этого шаблона, основанной на классах, вы обычно просто передаете new
объект каждый раз (как в вашем примере), но поскольку это в Draw
методе, я бы просто взял образец каждой стратегии, хранящейся в вашем классе, и передал существующую ссылку.
Другой способ реализовать этот шаблон — использовать делегаты. Для этого вам нужно, чтобы Draw
метод принял делегата с необходимой вам информацией. Что-то вроде:
public void Draw(SpriteBatch spriteBatch, Vector3 position, Action<int> drawStrategy)
{
...
drawStrategy(percentage);
}
Затем вы должны передать функцию для больших, маленьких, текстовых и т. Д. к этой функции. Action<int>
конечно, это был просто пример, вы можете заставить его возвращать значения или принимать дополнительные параметры по мере необходимости.
Если текстовая версия не использует процент, это запах кода, но вам, возможно, не нужно сильно беспокоиться об этом. Стратегия — это определенно правильный путь.