以下に、いくつかのイベントを含む単純なクラスを示します。Event
クラスについて心配する必要はありません。完璧です。
class Warrior:
def __init__(self, health, damage):
self.health = health
self.damage = damage
# events
self.e_hurt = Event()
self.e_attack = Event()
def hurt(self, damage):
self.health -= damage
self.e_hurt.fire()
def attack(self, target):
target.hurt(self.damage)
self.e_attack.fire()
私が理解できないのは、イベントをどこで発生させるかです。e_hurt
戦士が負傷したe_attack
後にイベントを起動し、戦士が攻撃した後にイベントを起動するのが最も理にかなっています。ただし、これにより、次の攻撃のvictim.e_hurt
前に発砲attacker.e_attack
されます。attacker
victim
def on_hurt():
print "Someone was hurt."
def on_attack():
print "Someone attacked."
def main():
victim = Warrior(50, 0)
victim.e_hurt.subscribe(on_hurt)
attacker = Warrior(50, 20)
attacker.e_attack.subscribe(on_attack)
attacker.attack(victim)
2 つのイベントは、「間違った」(プログラム的には正しいが、意味的には間違っている) 順序で出力されます。
Someone was hurt.
Someone attacked.
明らかに、他の戦士が怪我をする前に、戦士が攻撃する必要があります。もちろん、attack
-method を次のように変更することもできます。
def attack(self, target):
self.e_attack.fire()
target.hurt(self.damage)
しかし、実際の攻撃が発生する前に攻撃イベントを発生させるのは適切ではなく、攻撃後に他のイベントを呼び出す必要がある場合もあります。
私が考えることができる唯一の実際の解決策は、2 つのイベント (before_attack
およびafter_attack
) を持つことですが、1 つの実際のイベント (攻撃) に対して 2 つのイベントを必要としないより良い解決策はありますか?