I created the new branch that will use PyOSG.
[krufty_fps.git] / demo / Engine.py
blobdd1ec380f01f482870720aa9dc5ed1f4948348f2
1 #!/usr/bin/python
3 CONFIG = 'game_config.xml'
4 INIT = 'run.xml'
5 PACK_DIR = 'pack'
6 WINDOW_SIZE = (640, 480)
7 BACKGROUND_COLOR = (1, 0, 0, 0)
8 GUI_THEME = 'theme_two.zip'
9 WIDGETS_FILE = 'widgets.xml'
11 import os, sys
12 from os import *
13 from os.path import *
15 import pygame
16 from pygame import *
18 import lamina
20 from DerGUI import GUISystem
22 from zipfile import *
24 import copy
26 from xml.dom.minidom import parse, parseString
28 from experimental import *
29 from ThreadQueue import ThreadQueue
31 from Entity import *
33 def main():
35 print "Engine.py class... more documentation to come"
37 class Engine:
39 def __init__(self, config_file=CONFIG):
41 assert exists(config_file)
42 dom = parse(config_file)
43 self.config = reduceDOM(dom)
44 self.config = reduceConfig(self.config)
46 # pygame init stuff
48 window_size = WINDOW_SIZE
50 if self.config.has_key('window_size'):
51 try:
52 window_size = eval(self.config['window_size'])
53 except:
54 print "Engine.__init__(): Error in eval() using default window size of", WINDOW_SIZE
56 video_flags = OPENGL|DOUBLEBUF
57 self.display = pygame.display.set_mode(window_size, video_flags)
59 # OpenGL init stuff
61 background_color = BACKGROUND_COLOR
63 if self.config.has_key('background_color'):
64 try:
65 background_color = eval(self.config['background_color'])
66 except:
67 print "Engine.__init__(): Error in eval(), using default background color of", BACKGROUND_COLOR
69 # more stuff
71 if self.config.has_key('window_title'):
72 self.window_title = self.config['window_title']
73 else:
74 self.window_title = WINDOW_CAPTION
75 print "Engine.__init__(): No window title specified, using default of", WINDOW_CAPTION
77 pygame.display.set_caption(self.window_title)
79 # lamina and gui stuff
81 gui_theme = GUI_THEME
83 if self.config.has_key('gui_theme'):
84 gui_theme = self.config['gui_theme']
85 else:
86 print "Engine.__init__(): No gui theme specified, using default of", GUI_THEME
88 self.lamina_screen = lamina.LaminaScreenSurface()
89 self.gui_system = GUISystem(WIDGETS_FILE, gui_theme)
91 self.change = None
93 # zipfile stuff
95 self.filelist = {}
96 self.zipfiles = []
98 pack_dir = PACK_DIR
100 if self.config.has_key('pack_dir'):
101 pack_dir = self.config['pack_dir']
102 else:
103 print "Engine.__init__(): No pack directory specified, using default of", PACK_DIR
105 for file in listdir(pack_dir):
106 if is_zipfile(os.path.join(pack_dir, file)):
107 self.zipfiles.append(ZipFile(os.path.join(pack_dir, file)))
109 for item in self.zipfiles[-1].namelist():
110 self.filelist[item] = "self.zipfiles[" + str(len(self.zipfiles) - 1) + "].read(\"" + item + "\")"
112 self.texcache = {}
114 # file stuff
116 self.files = {}
118 self.menudefs = {}
119 self.objectdefs = {}
120 self.objects = []
121 self.menus = {}
123 self.running = 1
125 # thread stuff
127 self.event_queue = None
129 def addFile(self, filename, parent=''):
131 if self.filelist.has_key(filename):
133 dom = parseString(eval(self.filelist[filename]))
134 assert dom != None
136 parsed = reduceDOM(dom)
137 instances = []
139 results = {
140 'menu_def': {},
141 'object_def': {},
142 'menu_instance': {},
143 'object_instance': [],
144 'parent': None,
145 'children': []}
147 for item in parsed[1][0]:
149 if item[0] == 'def':
151 for defx in item[1][0]:
153 if defx[0] == 'object':
154 obj = reduceObjectDef(defx)
155 results['object_def'][obj['name']] = obj
156 self.objectdefs[obj['name']] = obj
158 if defx[0] == 'menu':
159 menu = reduceMenuDef(defx)
160 results['menu_def'][menu[0]] = menu
161 self.menudefs[menu[0]] = menu
163 if item[0] == 'instance':
165 for defx in item[1][0]:
167 inst = reduceInstance(defx)
168 instances.append(inst)
170 # do instance stuff here
171 for item in instances:
172 if item[0] == 'object':
173 print "debug", item
175 assert item[1]['contents'] in self.objectdefs.keys()
177 d = {}
178 for n in item[1].keys():
179 d[n] = item[1][n]
181 for n in self.objectdefs[item[1]['contents']].keys():
182 d[n] = self.objectdefs[item[1]['contents']][n]
184 nobject = Entity(self, d)
185 results['object_instance'].append(nobject)
186 self.objects.append(nobject)
188 results['parent'] = parent
189 if not parent == '':
190 self.files[parent]['children'].append(filename)
192 self.files[filename] = results
194 return 1
196 else:
197 return 0
199 def readZipfile(self, filename):
200 assert filename in self.filelist.keys()
201 return eval(self.filelist[filename])
203 def run(self):
205 if self.event_queue == None:
206 self.event_queue = ThreadQueue()
208 self.gui_system.draw(self.lamina_screen.surf)
209 self.lamina_screen.refresh()
211 while self.running:
213 self.processEvents()
214 self.draw()
215 pygame.display.flip()
217 return
219 def processEvents(self):
221 for e in pygame.event.get():
222 if e.type == QUIT:
223 self.running = 0
224 print "Engine.processEvents(): Should be quitting..."
226 self.change = self.gui_system.event(e)
228 new_event = convertEvent(e)
229 self.event_queue.append(new_event)
231 iterating = 1
232 while iterating:
234 if len(self.event_queue):
235 new_event = self.event_queue.pop()
236 else:
237 return
239 for obj in self.objects:
240 obj.event(new_event[0], new_event[1])
242 return
244 def draw(self):
246 self.lamina_screen.display()
248 return
250 if __name__ == '__main__': main()