2013-07-29 4 views
1

Im essayant de mettre en œuvre un système d'événement pour un jeu, où il y a des classes qui peuvent tirer ou gérer un événement wheter ou non mettre en œuvre ces interfaces:Comment mettre en place un système d'événements

public interface IGameEvent<T> where T : EventArgs 
{ 
    event EventHandler<T> OnEvent; 
} 

public interface IGameHandler<T> where T : EventArgs 
{ 
    void OnEvent(object sender, T e); 
} 

tout avait l'air bien jusqu'à ce que j'ai réalisé qu'aucune classe ne peut mettre en œuvre plus de 1 IGameEvent parce qu'il causerait la déclaration en double,

Voici un exemple:

public class Event 
{ 
    public KeyPressEvent OnKeyPress; 
    public UpdateEvent OnUpdate; 

    public void AddHadler<T>(IGameEvent<T> eEvent , IGameHandler<T> eHandler) where T : EventArgs 
    { 
     eEvent.OnEvent += eHandler.OnEvent; 
    } 

    public void RemoveHandler<T>(IGameEvent<T> eEvent, IGameHandler<T> eHandler) where T : EventArgs 
    { 
     eEvent.OnEvent -= eHandler.OnEvent; 
    } 
} 

keyPressEvent:

public class KeyPressEvent : IGameEvent<KeyPressEvent.KeyPressedEventArgs> 
{ 
    public class KeyPressedEventArgs : EventArgs 
    { 
     public KeyPressedEventArgs(Keys key) 
     { 
      Key = key; 
     } 

     public Keys Key { get; private set; } 
    } 

    public event EventHandler<KeyPressedEventArgs> OnEvent; 

    private void OnCheckForKeyPressed() //Example 
    { 
     if (OnEvent != null) 
      OnEvent(this, new KeyPressedEventArgs(Keys.Space)); 
    } 
} 

serait préférable de stocker manuellement les suscribers dans une liste dans le EventSystem?

À quel point cette approche serait-elle plus lente ou plus rapide?

Merci!

Répondre

1

L'approche commune consiste à implémenter un modèle d'agrégateur d'événements. La recherche Google vous fournira des tonnes de variations différentes. Par exemple, il pourrait ressembler à ceci (ce que j'utilise actuellement):

interface IEventsAggrgator 
{ 
    //fires an event, reperesented by specific message 
    void Publish<TMessage>(TMessage message); 
    //adds object to the list of subscribers 
    void Subscribe(object listener); 
    //remove object from the list of subscribers 
    void Unsubscribe(object listener); 
} 

interface IHandler<TMessage> 
{ 
    //implement this in subscribers to handle specific messages 
    void Handle(TMessage message); 
} 
Questions connexes