1 from direct
.fsm
.FSM
import FSM
2 from direct
.showbase
.DirectObject
import DirectObject
3 from lib
.observer
import Subject
6 class Colleague(Subject
):
10 def __init__(self
, mediator
):
11 Subject
.__init
__(self
)
12 self
.mediator
= mediator
# refactor: remove it
19 class FsmColleague(FSM
, Colleague
):
21 def __init__(self
, mediator
):
22 FSM
.__init
__(self
, self
.__class
__.__name
__)
23 Colleague
.__init
__(self
, mediator
)
26 if self
.state
: self
.cleanup()
27 Colleague
.destroy(self
)
30 class EventColleague(Colleague
, DirectObject
):
34 Colleague
.destroy(self
)
37 class AudioColleague(Colleague
): pass
40 class AiColleague(Colleague
): pass
43 class GfxColleague(Colleague
): pass
46 class GuiColleague(Colleague
): pass
49 class LogicColleague(Colleague
):
51 def on_start(self
): pass
54 class PhysColleague(Colleague
): pass
59 def __init__(self
, tgt_obj
, init_lst
, end_cb
):
61 tgt_obj
.attach(self
.on_comp_blt
)
63 self
.completed
= [False for _
in init_lst
]
65 self
.__init
_lst
= init_lst
66 for idx
, _
in enumerate(init_lst
): self
.__process
_lst
(tgt_obj
, idx
)
68 def __process_lst(self
, obj
, idx
):
69 if not self
.__init
_lst
[idx
]:
72 comp_info
= self
.__init
_lst
[idx
].pop(0)
73 attr_name
, cls
, arguments
= comp_info
74 self
.pending
[cls
.__name
__] = idx
75 setattr(obj
, attr_name
, cls(*arguments
))
77 def on_comp_blt(self
, obj
):
78 self
.__process
_lst
(obj
.mediator
, self
.pending
[obj
.__class
__.__name
__])
80 def end_lst(self
, idx
):
81 self
.completed
[idx
] = True
82 if all(self
.completed
):
83 if self
.end_cb
: self
.end_cb()
87 self
.__obj
.detach(self
.on_comp_blt
)
88 self
.__obj
= self
.end_cb
= self
.__init
_lst
= None
91 class GameObject(Subject
): pass