1

ゲームを構築していて、イベント システムを使用しようとしています。これは、実装方法の主なアイデアです。

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);
            }
        }
    }
}

さらに多くのイベントが発生し、このメソッドはコードを非常に複雑にすると思います。それを行うより良い方法はありますか?(コードのパフォーマンスと保守性を考慮して)。ありがとうございます!私の悪い英語でごめんなさい。

4

1 に答える 1

4

標準の C# イベントを使用しないのはなぜですか? イベントは複数のサブスクライバーを許可するため、これは同じ方法で処理されます。

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イベントはおそらく、あなたの世界 (または世界の一部) を表すクラス内で、非静的な方法でより適切になるでしょう。

于 2013-05-06T16:14:29.087 に答える