2011-01-14 8 views
2

XNA Wenn ich eine Button-Klasse habe, und ich habe eine ButtonManager-Klasse, die verwaltet, welche Schaltflächen auf dem Bildschirm je nach dem aktuellen Spielstatus gezeichnet werden (Hauptmenü , im Spiel, usw.), wie organisiere ich meinen Code, so dass der Benutzer auf einen anderen Bildschirm gelangt, wenn ich auf eine Schaltfläche klicke. (zB Optionsmenü, Ingame). Um genauer zu sein, wenn ich die Prüfung stellen würde, um zu sehen, ob der Benutzer auf die Schaltfläche im ButtonManager klickt, wie würde ich das Spiel wechseln und das eigentliche Spiel (das in einer ganz anderen Klasse ist) ausführen?XNA wie man Code mit Spielkomponenten (Managern) organisiert

  • Haupt gameclass
  • buttonManager Spielkomponente (fügt Tasten)
  • Button-Klasse

Antwort

2

Eine Möglichkeit, dies zu tun ist durch die Delegierten verwenden. Ein anderer Weg wäre, eine globale Klasse zu haben, die alle Klassen zur Bestimmung des Zustands verwenden.

Wenn Sie mit dem Konzept der Spielzustand nicht vertraut sind habe ich ein Tutorial auf meiner Website, die Sie in die Grundlagen (und die letzte Probe in diesem Tutorial Delegierten auch! Verwendet)

http://www.xnadevelopment.com/tutorials/thestateofthings/thestateofthings.shtml

+0

+1: Das ist, wie ich es tun, und es bedeutet, dass ich meinen Motor wieder verwenden kann, ohne Hartcodierung Wert drin. –

0

Lockerung Ihre Bildschirmklasse (Menübildschirm, Optionen, Bildschirm, Gameplay-Bildschirm usw.) muss die Funktionalität für jede angezeigte Schaltfläche enthalten. Zum Beispiel:

//in optionsScreen class' update method: 
if(input.gamepad.Buttons.A == ButtonState.Pressed && cursorSpriteRect.Intersects(button[0].Rect) 
{ 
    //begin transition into gameplay screen... or whatever 
} 
0

Ihr Spiel muss oder kann einen Verweis auf den Button-Manager erhalten. Normalerweise erstellt und besitzt Ihr Spiel den buttonManager.

class Game 
{ 
    ButtonManager m_buttonManager; 

    ... 
} 

Ihr Schaltflächenmanager kann ein Ereignis wie OnButtonClicked anzeigen.

class ButtonManager 
{ 
    private Button m_playGameButton; 

    // delegate to define the type of the event handler 
    public delegate void ButtonClickedEventHandler(ButtonId buttonId); 

    // event object matching the type of the event handler 
    public event ButtonClickedEventHandler OnButtonClicked; 

    void Update() 
    { 
     ... 

     if (m_playGameButton.Clicked) 
     { 
     // Launch the event when appropriate if there are any subscribers 
     if (OnButtonClicked != null) 
     { 
      OnButtonClicked(ButtonId.PlayGame) 
     } 
     } 
    } 
} 

Ihre Spielklasse kann das Ereignis abonnieren und eine Handler-Methode bereitstellen.

class Game 
{ 
    ... 

    void Initialise() 
    { 
     m_buttonManager += ButtonClicked; 
    } 

    void ButtonClicked(ButtonId buttonId) 
    { 
     switch (buttonId) 
     { 
      case ButtonId.PlayGame: 
       PlayGame(); 
       break; 

      case ButtonId.OptionsMenu: 
       OptionsMenu(); 
       break; 
     } 
    } 

    ... 
} 

Alternativ kann das Spiel Klasse auf den Button Manager abzufragen.

class Game 
{ 
    ... 

    void Update() 
    { 
     if (m_buttonManager.IsPlayGameButtonHit) 
     { 
     PlayGame(); 
     } 
     else if (m_buttonManager.IsOptionsMenuButtonHit) 
     { 
     OptionsMenu(); 
     } 
    } 

    ... 
} 
Verwandte Themen