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