キーボードイベントと、関数を登録できるイベントシステムがあり、ゲーム時のイベントのリストと実際のイベントのリストの2つのリスト(任意のサイズ)を返す必要があるゲームを作成しています。タイムイベント(この順序で)。その後、イベントランナーは
これを行うためにコードをリファクタリングしているところです。以前のシステムでは、イベントは手動でイベントをメインのゲーム時間/リアルタイムイベントキューとマージしていました。
キーが押された/離されたときにすべてのイベントをトリガーするコードをリファクタリングしようとしています。現在のコード:
class KeyReleaseEventRunner
GameEvents = []
RealEvents = []
def __call__(self):
"""Run all relevant events."""
# Run key-specific key release events
KeyReleaseEvent[self.key]()
# Run key-specific key toggle events
KeyToggleEvent[self.key](False)
# Run generic key release events
KeyReleaseEvent(self.key)
# Run generic key toggle events
KeyToggleEvent(self.key, False)
私の質問は、これらの各関数からのすべてのイベントをマージする方法です。
これを行うためのより簡単で読みやすい方法はありますか?:
def __call__(self):
"""Run all relevant events."""
# Run key-specific key release events
g_events, r_events = KeyReleaseEvent[self.key]()
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Run key-specific key toggle events
g_events, r_events = KeyToggleEvent[self.key](False)
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Run generic key release events
g_events, r_events = KeyReleaseEvent(self.key)
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Run generic key toggle events
g_events, r_events = KeyToggleEvent(self.key, False)
self.GameEvents.extend(g_events)
self.RealEvents.extend(r_events)
# Events must maintain sorted-ness
self.GameEvents.sort()
self.RealEvents.sort()
KeyReleaseEventRunnerでメソッドを作成したくありません(この状況は他のいくつかの場所にあり、GameEvents / RealEventsの代わりにローカル変数を使用することがよくあります)。
より一般的には、これらの関数が2つのリストを返すようにするためのより良い解決策はありますか?
g_eventsとr_eventsのイベントを区別することができます。
編集:
オブジェクトが呼び出し可能であり、索引付け可能であるという混乱を解消するには、次のようにします。
Event
のインスタンスは、関数を登録するためのインターフェイスであり、呼び出されると、登録されているすべてのオブジェクトを呼び出す ことに注意してください。KeyToggleEvent
およびKeyReleaseEvent
(およびKeyPressEvent
)は、のサブクラスのインスタンスでありEvent
、これにより、他のモジュールは(に登録することにより)キー固有のイベントを登録でき、(に登録することによりKeyReleaseEvent[key]
)非キー固有のイベントを登録できKeyReleaseEvent
ます。