イベントシステム


ネットゲームでは、イベントシステムは不可欠なモジュールです.怪を殺す、採集するなど、いくつかの事件を簡単に処理することができます.
モジュール間の結合度を低減する良い方法でもある.次に、イベントシステムを実装します.
声明:多くの人がイベントシステムを見ると、UIライブラリのイベントドライバを連想します.これはUIではなく、ネットゲームだと言わざるを得ません.
本イベントシステムは,設計上はオンラインゲームサーバサービスであり,UIに必ずしも適しているとは限らず,オンラインゲームのイベントも複雑ではなく,イベントを上下層に配布する必要もない.
1つの事件、典型的な表現は:○○事件が発生して、実行条件を判断して、もし満たすならば、○○行為を実行します.
具体的なネットゲームの開発では、より簡単に設計され、○○イベントが発生し、○○関数を実行します.
#         
g_EventList = ("    ",)


class CEventMgr:

	def __init__(self, iID):
		self.m_ID = iID
		self.m_EventDict = {}    #       

	def AddEvent(self, sEventName, bSync, cbFunc):
		"""
		       
		@param sEventName:string,    
		@param bSync:bool,      
		@param cbFunc:function,    
		"""
		global g_EventList
		if not sEventName in g_EventList:
			raise "  %s   ,   " % sEventName
		tInfo = (bSync, cbFunc)
		tEventList = self.m_EventDict.get(sEventName, [])
		if tInfo in tEventList:
			raise "  %s %s     ,   " % (sEventName, tInfo)
		tEventList.append(tInfo)
		self.m_EventDict[sEventName] = tEventList

	def RemoveEvent(self, sEventName, bSync, cbFunc):
		"""
		       
		@param sEventName:string,    
		@param bSync:bool,      
		@param cbFunc:function,    
		"""
		tInfo = (bSync, cbFunc)
		if not sEventName in self.m_EventDict:
			return
		tEventList = self.m_EventDict[sEventName]
		if not tInfo in tEventList:
			return
		tEventList.remove(tInfo)
		self.m_EventDict[sEventName] = tEventList

	def FireEvent(self, sEventName, *args):
		"""
		    
		@param sEventName:string,    
		@param args:tuple,    
		"""
		tEventList = self.m_EventDict.get(sEventName, [])
		if not tEventList:
			return
		for tEvent in tEventList:
			bSync, cbFunc = tEvent
			#       
			if not bSync:
				continue
			cbFunc(*args)
		#                
		#self.FireEventAsync(sEventName, *args)

	def FireEventAsync(self, sEventName, *args):
		tEventList = self.m_EventDict.get(sEventName, [])
		if not tEventList:
			return
		for tEvent in tEventList:
			bSync, cbFunc = tEvent
			if bSync:
				continue
			cbFunc(*args)
は簡単でしょう.
1、イベントは同期か非同期かを区別します.もちろん、bSyncを整数に変換して優先度を表すこともできます.そしてFireEventの場合は、イベントの優先順位で実行します.
しかし、これはあまり役に立たないと思います.少なくとも今は見ていません.同期か非同期かしか区別できません
2、FireEvent最後に、非同期処理を実行する必要がある場合は、次のサイクルで関数が実行されることを保証するタイマが必要です.ここには書いていません.タイマーのコードがまだ整理されていないからです.
3、コールバック関数は一度パッケージできます.そうすると、リスニング時にパラメータを入力できます.
4、イベントが初期化されたときに、イベントを分散させるためのIDを入力する必要がある.イベントシステムがグローバルに1つしかない場合、このイベント辞書は異常に膨大になります.
プレイヤーがいて、モンスターがいて、検索するのに時間がかかります.だから、私が望んでいるのは、生物類ごとにイベントシステムをつなぐことです.自分の事件を自分で傍受する.グローバルなイベントシステムを維持し
単一の生物のイベントが実現できない場合,グローバルイベントで実現できる.
5、イベントを削除するときは、できるだけFireEventの外で実行し、イベントがトリガーされる過程で削除しないでください.これは改善が必要だ.
最も簡単なイベントシステムは、そうです.