##master-page:HomepageTemplate ##master-date:2004-01-29 23:45:45 #format wiki #language zh == Action模式实现 == --- by [[huangyi]] [[yi.codeplayer@gmail.com]] 今天看到 [[http://harkal.sylphis3d.com/2005/08/10/multithreaded-game-scripting-with-stackless-python/|这篇好文]], 里面有一部分讲到Action模式在游戏里面的应用, 感觉有点意思就随手写了写, 总算赶在熄灯之前搞定, 呵呵。 希望这半桶水的英文注释不会让你感觉太头疼 :) {{{#!python class Action(object): reg_after = {} reg_before = {} def __init__(self,func): self.internal = func def __call__(self): '''excute all actions registered to excute before self, then excute self, last excute all actions registered to excute after self.''' if self.reg_before.has_key(self): acs = self.reg_before[self] for a in acs: a() self.internal() if self.reg_after.has_key(self): acs = self.reg_after[self] for a in acs: a() def before(self,action): 'register self take place before action' self.register(action,self,self.reg_before) def after(self,action): 'register self take place after action' self.register(action,self,self.reg_after) @staticmethod def register(ac1,ac2,reg): if reg.has_key(ac1): reg[ac1].append(ac2) else:reg[ac1]=[ac2] class Door(object): def __init__(self,no): self.no = no self.Open = Action(self.ac_Open) def ac_Open(self): print 'door',self.no,'open' class Player(object): def __init__(self,name): self.name = name self.Die = Action(self.ac_Die) def ac_Die(self): print self.name,'player die' class Beer(object): def __init__(self,no): self.no = no self.Start = Action(self.ac_Start) def ac_Start(self): print 'beer',self.no,'start' if __name__ =='__main__': player = Player('hy') door = Door(1) beer = Beer(1) door.Open.before(player.Die) beer.Start.after(door.Open) player.Die() }}} ... ---- ---- [[个人网页分类]]