2013-05-06 25 views
1

我正在構建一個遊戲並嘗試使用事件系統。 這是它是如何實現的主要思路:C中的遊戲事件處理系統#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Blocker2 
{ 
    public delegate void OnPlayerMoved(PlayerMovedEvent e); 
    public delegate void OnPlayerSpawned(PlayerSpawnedEvent e); 
    public delegate void OnBlockBreak(BlockBreakEvent e); 
    public delegate void OnBlockPlaced(BlockPlacedEvent e); 

    public static class EventHandler 
    { 
     private static List<OnPlayerMoved> _onPlayerMoved; 
     private static List<OnPlayerSpawned> _onPlayerSpawned; 
     private static List<OnBlockBreak> _onBlockBreak; 
     private static List<OnBlockPlaced> _onBlockPlaced; 


     static EventHandler() 
     { 

     } 

     public static void Subscribe() 
     { 

     } 

     // -------------------------- Player Related Events -------------------------- 
     public static void OnPlayerMoved(PlayerMovedEvent e) 
     { 
      foreach (OnPlayerMoved del in _onPlayerMoved) 
      { 
       del(e); 
      } 
     } 

     public static void OnPlayerSpawned(PlayerSpawnedEvent e) 
     { 
      foreach (OnPlayerSpawned del in _onPlayerSpawned) 
      { 
       del(e); 
      } 
     } 

     // -------------------------- Block Related Events -------------------------- 
     public static void OnBlockBreak(BlockBreakEvent e) 
     { 
      foreach (OnBlockBreak del in _onBlockBreak) 
      { 
       del(e); 
      } 
     } 

     public static void OnBlockPlaced(BlockPlacedEvent e) 
     { 
      foreach (OnBlockPlaced del in _onBlockPlaced) 
      { 
       del(e); 
      } 
     } 
    } 
} 

而且有將是很多更多的事件,我認爲這種方法將會使代碼非常非常複雜。有更好的方法來做到這一點? (考慮代碼的性能和可維護性)。 感謝先進! 對不起,我的英語不好。

+0

爲什麼不使用'eventHandler <>'? 'EventHandler'是一個MulticastDelegate,所以你不需要維護自己的列表。 – JeffRSon 2013-05-06 16:15:06

+1

是不是有沒有使用'event'關鍵字並使用標準C#事件的原因?此外,讓您的活動可以從任何地方公開開火併不是最好的主意。最好是讓班級內的事件實際上解除他們,所以只有這樣做纔有責任。 – Servy 2013-05-06 16:15:09

+0

爲什麼不[[MonoGame]](http://monogame.codeplex.com/)? – Romoku 2013-05-06 16:15:22

回答

4

爲什麼不使用標準C# events?他們將以同樣的方式處理這個問題,因爲事件允許多個用戶。

在C#標準的事件機制允許多個用戶訂閱的事件,看起來像:

public static event EventHandler<PlayerMovedEventArgs> PlayerMoved; 

// Often, you'll have a method to raise the event: 
public static void OnPlayerMoved(PlayerMovedEventArgs args) 
{ 
    var handler = PlayerMoved; 
    if (handler != null) 
     handler(null, args); 
} 

話雖這麼說,我會建議把這些到它們是相關的類,而不是讓他們全球化/靜態化。然後,您可以使該方法將事件提升爲該類的私有事件,這將允許您保持設計的可維護性。

例如,PlayerMoved事件在代表您的世界(或世界的一部分)的某個類中可能更合適,並且以非靜態方式存在。

+0

非常感謝您的答案!但是,你能寫一個例子說明我可以爲這個事件訂閱額外的功能嗎?以及如何爲每個事件觸發器調用它們。 – UnTraDe 2013-05-06 16:44:33

+0

@UnTraDe「PlayerMovedEventArgs」是一個派生自「EventArgs」的類 - 您可以添加任何內容。 'OnPlayerMoved'顯示如何觸發它。訂閱只是'PlayerMoved + = SomeDelegate' - 請參閱我鏈接的事件教程以瞭解詳細信息。 – 2013-05-06 16:49:37