ya2 · news · projects · code · about

50dc5a1bc65ea259883ab593e5232377ddc0457a
[pmachines.git] / ya2 / patterns / gameobject.py
1 from direct.fsm.FSM import FSM
2 from direct.showbase.DirectObject import DirectObject
3 from ya2.patterns.observer import Subject
4
5
6 class Colleague(Subject):
7
8 eng = None
9
10 def __init__(self, mediator):
11 Subject.__init__(self)
12 self.mediator = mediator # refactor: remove it
13
14 def destroy(self):
15 self.mediator = None
16 Subject.destroy(self)
17
18
19 class FsmColleague(FSM, Colleague):
20
21 def __init__(self, mediator):
22 FSM.__init__(self, self.__class__.__name__)
23 Colleague.__init__(self, mediator)
24
25 def destroy(self):
26 if self.state:
27 self.cleanup()
28 Colleague.destroy(self)
29
30
31 class EventColleague(Colleague, DirectObject):
32
33 def destroy(self):
34 self.ignoreAll()
35 Colleague.destroy(self)
36
37
38 class AudioColleague(Colleague):
39 pass
40
41
42 class AiColleague(Colleague):
43 pass
44
45
46 class GfxColleague(Colleague):
47 pass
48
49
50 class GuiColleague(Colleague):
51 pass
52
53
54 class LogicColleague(Colleague):
55
56 def on_start(self): pass
57
58
59 class PhysColleague(Colleague):
60 pass
61
62
63 class GODirector:
64
65 def __init__(self, tgt_obj, init_lst, end_cb):
66 self.__obj = tgt_obj
67 tgt_obj.attach(self.on_comp_blt)
68 self.end_cb = end_cb
69 self.completed = [False for _ in init_lst]
70 self.pending = {}
71 self.__init_lst = init_lst
72 for idx, _ in enumerate(init_lst):
73 self.__process_lst(tgt_obj, idx)
74
75 def __process_lst(self, obj, idx):
76 if not self.__init_lst[idx]:
77 self.end_lst(idx)
78 return
79 comp_info = self.__init_lst[idx].pop(0)
80 attr_name, cls, arguments = comp_info
81 self.pending[cls.__name__] = idx
82 setattr(obj, attr_name, cls(*arguments))
83
84 def on_comp_blt(self, obj):
85 self.__process_lst(obj.mediator, self.pending[obj.__class__.__name__])
86
87 def end_lst(self, idx):
88 self.completed[idx] = True
89 if all(self.completed):
90 if self.end_cb:
91 self.end_cb()
92 self.destroy()
93
94 def destroy(self):
95 self.__obj.detach(self.on_comp_blt)
96 self.__obj = self.end_cb = self.__init_lst = None
97
98
99 class GameObject(Subject):
100 pass