3 CONFIG
= 'game_config.xml'
6 WINDOW_SIZE
= (640, 480)
7 BACKGROUND_COLOR
= (1, 0, 0, 0)
8 GUI_THEME
= 'theme_two.zip'
9 WIDGETS_FILE
= 'widgets.xml'
10 TEMP_FILE
= "dtemp.3ds"
21 from DerGUI
import GUISystem
27 from xml
.dom
.minidom
import parse
, parseString
29 from experimental
import *
30 from ThreadQueue
import ThreadQueue
32 from PyOSG
import osg
, osgUtil
, osgDB
38 print "Engine.py class... more documentation to come"
42 def __init__(self
, config_file
=CONFIG
):
44 assert exists(config_file
)
45 dom
= parse(config_file
)
46 self
.config
= reduceDOM(dom
)
47 self
.config
= reduceConfig(self
.config
)
51 window_size
= WINDOW_SIZE
53 if self
.config
.has_key('window_size'):
55 window_size
= eval(self
.config
['window_size'])
57 print "Engine.__init__(): Error in eval() using default window size of", WINDOW_SIZE
59 video_flags
= OPENGL|DOUBLEBUF
60 self
.display
= pygame
.display
.set_mode(window_size
, video_flags
)
64 background_color
= BACKGROUND_COLOR
66 if self
.config
.has_key('background_color'):
68 background_color
= eval(self
.config
['background_color'])
70 print "Engine.__init__(): Error in eval(), using default background color of", BACKGROUND_COLOR
72 self
.root
= osg
.Group()
74 self
.sceneView
= osgUtil
.SceneView()
75 self
.sceneView
.setDefaults()
77 self
.sceneView
.setSceneData(self
.root
)
78 self
.sceneView
.setClearColor(
79 osg
.Vec4(background_color
[0], background_color
[1],
80 background_color
[2], background_color
[3]))
84 if self
.config
.has_key('window_title'):
85 self
.window_title
= self
.config
['window_title']
87 self
.window_title
= WINDOW_CAPTION
88 print "Engine.__init__(): No window title specified, using default of", WINDOW_CAPTION
90 pygame
.display
.set_caption(self
.window_title
)
92 # lamina and gui stuff
96 if self
.config
.has_key('gui_theme'):
97 gui_theme
= self
.config
['gui_theme']
99 print "Engine.__init__(): No gui theme specified, using default of", GUI_THEME
101 self
.lamina_screen
= lamina
.LaminaScreenSurface()
102 self
.gui_system
= GUISystem(WIDGETS_FILE
, gui_theme
)
113 if self
.config
.has_key('pack_dir'):
114 pack_dir
= self
.config
['pack_dir']
116 print "Engine.__init__(): No pack directory specified, using default of", PACK_DIR
118 for file in os
.listdir(pack_dir
):
119 if is_zipfile(os
.path
.join(pack_dir
, file)):
120 self
.zipfiles
.append(ZipFile(os
.path
.join(pack_dir
, file)))
122 for item
in self
.zipfiles
[-1].namelist():
123 self
.filelist
[item
] = "self.zipfiles[" + str(len(self
.zipfiles
) - 1) + "].read(\"" + item
+ "\")"
138 self
.event_queue
= None
140 def addFile(self
, filename
, parent
=''):
142 if self
.filelist
.has_key(filename
):
144 dom
= parseString(eval(self
.filelist
[filename
]))
147 parsed
= reduceDOM(dom
)
154 'object_instance': [],
158 for item
in parsed
[1][0]:
162 for defx
in item
[1][0]:
164 if defx
[0] == 'object':
165 obj
= reduceObjectDef(defx
)
166 results
['object_def'][obj
['name']] = obj
167 self
.objectdefs
[obj
['name']] = obj
169 if defx
[0] == 'menu':
170 menu
= reduceMenuDef(defx
)
171 results
['menu_def'][menu
[0]] = menu
172 self
.menudefs
[menu
[0]] = menu
174 if item
[0] == 'instance':
176 for defx
in item
[1][0]:
178 inst
= reduceInstance(defx
)
179 instances
.append(inst
)
181 # do instance stuff here
182 for item
in instances
:
183 if item
[0] == 'object':
184 assert item
[1]['contents'] in self
.objectdefs
.keys()
187 for n
in item
[1].keys():
190 for n
in self
.objectdefs
[item
[1]['contents']].keys():
191 d
[n
] = self
.objectdefs
[item
[1]['contents']][n
]
193 nobject
= Entity(self
, d
)
194 results
['object_instance'].append(nobject
)
195 self
.objects
.append(nobject
)
197 results
['parent'] = parent
199 self
.files
[parent
]['children'].append(filename
)
201 self
.files
[filename
] = results
208 def readZipfile(self
, filename
):
209 assert filename
in self
.filelist
.keys()
210 return eval(self
.filelist
[filename
])
212 def readNodeFile(self
, filename
):
218 if exists(TEMP_FILE
):
219 os
.rename(TEMP_FILE
, TEMP_FILE
+ ".bak")
220 print "Engine.readNodeFile(): Renaming existing file..."
223 temp_file
= open(TEMP_FILE
, 'wb')
226 # print "Engine.readNodeFile(): Error opening temp file.", TEMP_FILE
231 data
= self
.readZipfile(filename
)
234 print "Engine.readNodeFile(): Error reading filename"
238 temp_file
.write(data
)
242 node
= osgDB
.readNodeFile(TEMP_FILE
)
244 if exists(TEMP_FILE
+ ".bak"):
245 os
.rename(TEMP_FILE
+ ".bak", TEMP_FILE
)
253 if self
.event_queue
== None:
254 self
.event_queue
= ThreadQueue()
256 self
.lamina_screen
.clear()
257 self
.gui_system
.draw(self
.lamina_screen
.surf
)
258 self
.lamina_screen
.refresh()
264 pygame
.display
.flip()
268 def processEvents(self
):
270 for e
in pygame
.event
.get():
273 print "Engine.processEvents(): Should be quitting..."
275 self
.change
= self
.gui_system
.event(e
)
277 new_event
= convertEvent(e
)
278 self
.event_queue
.append(new_event
)
283 if len(self
.event_queue
):
284 new_event
= self
.event_queue
.pop()
288 for obj
in self
.objects
:
289 obj
.event(new_event
[0], new_event
[1])
295 self
.sceneView
.update()
296 self
.sceneView
.cull()
297 self
.sceneView
.draw()
299 self
.lamina_screen
.display()
303 if __name__
== '__main__': main()