Как предлагать перезапись атрибутов в зависимости от состояния моего пользовательского класса кнопок в C # - PullRequest
0 голосов
/ 07 декабря 2011

Я работаю над пользовательским классом кнопок для моей игры XNA.Следовательно, я занимаюсь разработкой игры на C #.

Мой класс кнопок очень простой, он предоставляет обязательные события, такие как MouseOver, MouseOut, MouseDown и т. Д. Кроме того, у него есть некоторые открытые свойства, которые влияют на общий вид, например Text, TextAlign, BackgroundColor, TextColor и Font.

Каждая кнопка может находиться в 4 различных состояниях: нормальный, зависший, нажатый и неактивный.Я хотел бы дать разработчикам моей игры возможность указать определенные «перезаписи», которые будут контролировать внешний вид кнопки «на основе состояния».

К сожалению, я не могу придумать причудливое решение.В настоящее время я просто создаю массив, который может содержать отдельный экземпляр Button для каждого состояния.Теперь, если пользователь хочет создать перезапись для, скажем, состояния Hovered, он просто должен создать новый экземпляр Button в соответствующей позиции индекса массива button (я использовал перечисление для этого отображения, которое будет приведено к байтовому значению).чтобы получить правильную позицию индекса).Теперь пользователь может определить перезапись для каждой возможной комбинации свойств <->.

В методе рисования я наконец проверяю, какое состояние в данный момент является активным для моей кнопки, и рисую соответствующий экземпляр кнопки из моего массива.collection.

Это не очень чистое решение, поскольку оно создает большие накладные расходы в случае, если я хочу перезаписать TextColor только для одного состояния.Мне было интересно, как это обычно решается в более профессиональных решениях.

У кого-нибудь есть несколько советов по шаблонам проектирования, которые могут быть полезны в этой области?У меня были проблемы с поиском решения, так как мне не хватало значимых ключевых слов.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

вы можете попробовать реализовать свои собственные настройки класса

EDIT

public class ButtonSettings
{
  private ButtonSettings parentSettings;

  public void ButtonSettings(ButtonSettings parent)
  {
    parentSettings = parent;
    if (parent == null)
    {
      // initialize default values
      TextAlign = TextAlign.Left;
      // ...
    }
  }

  private Alignement textAlign = null;
  public Alignement TextAlign
  {
    get { return textAlign != null ? textAlign : (parentSettings != null ? parentSettings.TextAlign : default(Alignement)); };
    set { textAlign = value; };
  }

  // do the same as TextAlign ...
  public Color BackgroundColor { get; set; }
  public Color TextColor { get; set; }
  public Font Font { get; set; }
}


public enum ButtonState
{
  Normal,
  Hovered,
  Pressed
  Inactive
}

и используйте его на своем классе кнопок

public class CustomButton : Button
{
  public CustomButton ()
  {
    // initialize your settings
    Normal = new ButtonSettings();
    Hovered = new ButtonSettings(Normal);
    Pressed = new ButtonSettings(Normal);
    Inactive = new ButtonSettings(Normal);

    State = ButtonState.Normal;
  }

  public ButtonSettings Normal { get; set; }
  public ButtonSettings Hovered { get; set; }
  public ButtonSettings Pressed { get; set; }
  public ButtonSettings Inactive { get; set; }

  public ButtonState State { get; set; }
}

теперь пользователь может использовать вашу пользовательскую кнопку и изменять настройки

надеюсь, это поможет

0 голосов
/ 08 декабря 2011

Моя идея была похожа на punker76, но, чтобы добавить к этому, не забывайте о спрайт-листах.

Вы можете иметь один лист кнопок с четырьмя пустыми кнопками и просто перемещать SourceRectangle при каждом изменении состояния. Вместо сохранения четырех разных экземпляров кнопок для «одной кнопки» каждая кнопка содержит четыре набора настроек (я думаю, в массиве) и один лист спрайтов в нужной форме кнопки для каждого состояния.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...