Tag Archive for Buttons

Short: Button Status erweitern

Zurzeit überarbeite ich den Input-Teil meiner Engine und möchte nun eine Möglichkeit präsentieren, wie man den doch recht simplen ButtonState von XNA erweiter kann.

Erst einmal zur Erinnerung: Die ButtonState Enumeration für z.b. den Mouse LeftButton bietet nur zwei States an. Pressed und Released. Für den Anfang mag das vollkommen ausreichend sein, doch wenn man erweiterte UI Features wie das Ändern des Buttonbildes beim Klick einbaut möchte man oft mehr State-Informationen haben.

Daher habe ich nun folgende States zusammengefasst:

  • NotPressed: Der Button ist nicht gedrückt, er wurde noch nie gedrückt, oder der vorherige Status war Released.
  • JustPressed: Der Button wurde gerade gedrückt, der vorherige Status war NotPressed.
  • Pressed: Der Button ist weiterhin gedrückt, der vorherige Status war JustPressed.
  • Released: Der Button wurde losgelassen und der vorherige Status war JustPressed oder Pressed.

Das sind nun schon einige Möglichkeiten mehr, auf die man zurückgreifen kann. Man kann überprüfen ob der Button schnell geklickt wurde (JustPressed dann Released), oder mit JustPressed beginnt z.b. ein Dragging, bei Pressed wird das Dragging fortgesetzt und bei Released beendet. Da finden sich einige Anwendungsfälle.

Aber wie kann man mit hilfe der zwei States von XNA nun diese vier setzten? Das ist recht einfach. Dafür habe ich mir folgende Methode gebaut, welche für alle Buttons verwendbar ist:

1
2
3
4
5
6
7
8
9
10
11
12
13
private ExtendedButtonState HandleButton(bool pressed, bool previousPressed)
{
  if (pressed && previousPressed == false)
    return ExtendedButtonState.JustPressed;
 
  if (pressed && previousPressed)
    return ExtendedButtonState.Pressed;
 
  if (pressed == false && previousPressed)
    return ExtendedButtonState.Released;
 
  return ExtendedButtonState.NotPressed;
}
private ExtendedButtonState HandleButton(bool pressed, bool previousPressed)
{
  if (pressed && previousPressed == false)
    return ExtendedButtonState.JustPressed;

  if (pressed && previousPressed)
    return ExtendedButtonState.Pressed;

  if (pressed == false && previousPressed)
    return ExtendedButtonState.Released;

  return ExtendedButtonState.NotPressed;
}

Die Methode bekommt ganz einfach einen boolean, welcher angibt ob der aktuelle ButtonState Pressed ist und einen weiteren boolean, ob der letzte State Pressed war. Mehr brauchen wir gar nicht.

Dann überprüfen wir:

  • Ist der Button jetzt gedrückt und war vorher nicht gedrückt? Also JustPressed.
  • Ist der Button gedrückt und wurde vorher schon gedrückt? Also Pressed.
  • Ist der Button nicht mehr gedrückt und war vorher gedrückt? Dann Released.
  • Und wenn nichts davon zutrifft, dann haben wir den NotPressed Status.

Und schon hat man eine sehr viel detailierte Übersicht über den aktuellen Button-Status. Hier noch kurz der Aufruf der Methode:

1
2
3
4
5
6
7
8
LeftButton = HandleButton(state.LeftButton == ButtonState.Pressed,
  lastState.LeftButton == ButtonState.Pressed);
 
MiddleButton = HandleButton(state.MiddleButton == ButtonState.Pressed,
  lastState.MiddleButton == ButtonState.Pressed);
 
RightButton = HandleButton(state.RightButton == ButtonState.Pressed,
  lastState.RightButton == ButtonState.Pressed);
LeftButton = HandleButton(state.LeftButton == ButtonState.Pressed,
  lastState.LeftButton == ButtonState.Pressed);

MiddleButton = HandleButton(state.MiddleButton == ButtonState.Pressed,
  lastState.MiddleButton == ButtonState.Pressed);

RightButton = HandleButton(state.RightButton == ButtonState.Pressed,
  lastState.RightButton == ButtonState.Pressed);