Extensive modifications to get shooter-game running
- fixed a number of issues with the "anims" module that was still depending on pygame and old timer mechanics. - fixed case sensitivity issue in "files" module - fixed some of the sprite functions (add_sprite_layer in particular) in "models" - added some new gametimer and engine getter/setters to "roc_main" - significant improvements to "gamedata" backported from shooter, greatly improves error messages
This commit is contained in:
parent
e74599be02
commit
873cda7357
8 changed files with 93 additions and 34 deletions
|
@ -7,3 +7,4 @@ include
|
||||||
pip-selfcheck.json
|
pip-selfcheck.json
|
||||||
__pycache__
|
__pycache__
|
||||||
*.orig
|
*.orig
|
||||||
|
share
|
||||||
|
|
25
roc/anims.py
25
roc/anims.py
|
@ -1,7 +1,9 @@
|
||||||
import os
|
import os
|
||||||
import files
|
from . import files
|
||||||
import gametimer
|
from . import gametimer
|
||||||
import video
|
from . import video
|
||||||
|
from . import models
|
||||||
|
from . import roc_main
|
||||||
|
|
||||||
class anim(object):
|
class anim(object):
|
||||||
def __init__(self, frameset):
|
def __init__(self, frameset):
|
||||||
|
@ -13,7 +15,7 @@ class anim(object):
|
||||||
self.done = False
|
self.done = False
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
self.frame_timer -= gametimer.elapsed()
|
self.frame_timer -= roc_main.get_timer().elapsed
|
||||||
while self.frame_timer <= 0:
|
while self.frame_timer <= 0:
|
||||||
self.dirty = True
|
self.dirty = True
|
||||||
self.frame += 1
|
self.frame += 1
|
||||||
|
@ -33,8 +35,8 @@ class anim(object):
|
||||||
|
|
||||||
return self.dirty
|
return self.dirty
|
||||||
|
|
||||||
def draw(self, scr, pos):
|
def draw(self):
|
||||||
self.frameset.draw(scr, pos, self.frame)
|
self.frameset.draw(self.frame)
|
||||||
self.dirty = False
|
self.dirty = False
|
||||||
|
|
||||||
def size(self):
|
def size(self):
|
||||||
|
@ -51,8 +53,8 @@ class anim_frameset(object):
|
||||||
self.frame_delays = []
|
self.frame_delays = []
|
||||||
self.set_delay(delay)
|
self.set_delay(delay)
|
||||||
|
|
||||||
def load_frames(self, ifn):
|
def load_frames(self, iff):
|
||||||
ifn, ife = os.path.splitext(ifn)
|
ifn, ife = os.path.splitext(iff)
|
||||||
fnp, fnn = os.path.split(ifn)
|
fnp, fnn = os.path.split(ifn)
|
||||||
if ifn and ifn[-1] == '1':
|
if ifn and ifn[-1] == '1':
|
||||||
self.frames = []
|
self.frames = []
|
||||||
|
@ -95,9 +97,12 @@ class anim_frameset(object):
|
||||||
|
|
||||||
|
|
||||||
def size(self):
|
def size(self):
|
||||||
r = self.frames[0].get_rect()
|
sc = self.frames[0].layers[0].scale
|
||||||
return (r.w, r.h)
|
return int(sc[0]), int(sc[1])
|
||||||
|
|
||||||
|
|
||||||
|
def draw(self, frame):
|
||||||
|
self.frames[frame].render()
|
||||||
"""
|
"""
|
||||||
def draw(self, scr, pos, frame):
|
def draw(self, scr, pos, frame):
|
||||||
if scr != self.cached_surface:
|
if scr != self.cached_surface:
|
||||||
|
|
|
@ -26,7 +26,12 @@ class filemanager(object):
|
||||||
return pygame.image.load(filename)
|
return pygame.image.load(filename)
|
||||||
|
|
||||||
def canonize_path(self, path):
|
def canonize_path(self, path):
|
||||||
return path.lower()
|
return path
|
||||||
|
|
||||||
|
def exists(self, *args):
|
||||||
|
filename = self.path(*args)
|
||||||
|
return os.path.exists(filename)
|
||||||
|
|
||||||
|
|
||||||
def init():
|
def init():
|
||||||
global mgr
|
global mgr
|
||||||
|
|
|
@ -8,6 +8,17 @@ from . import files
|
||||||
from . import shader
|
from . import shader
|
||||||
from .deprecate import deprecated
|
from .deprecate import deprecated
|
||||||
|
|
||||||
|
class GameDataParseError(Exception):
|
||||||
|
def __init__(self, msg, xpath, exc_info=None):
|
||||||
|
self.xpath = xpath
|
||||||
|
self.msg = msg
|
||||||
|
errmsg = self.msg % ('/'.join(self.xpath),)
|
||||||
|
self.exc_info = exc_info
|
||||||
|
Exception.__init__(self, errmsg)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MissingNode(object):
|
class MissingNode(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.text = None
|
self.text = None
|
||||||
|
@ -114,11 +125,24 @@ class XMLGameDataReader(object):
|
||||||
elif (node.missing or value == None) and df.opt:
|
elif (node.missing or value == None) and df.opt:
|
||||||
value = df.default
|
value = df.default
|
||||||
elif (node.missing or value == None) and not allow_missing:
|
elif (node.missing or value == None) and not allow_missing:
|
||||||
raise ValueError("Missing value for mandatory tag %s" % (bin.get('name'),))
|
raise GameDataParseError("Missing value for mandatory tag %s", [bin.get('name')])
|
||||||
elif (node.missing or value == None):
|
elif (node.missing or value == None):
|
||||||
value = None
|
value = None
|
||||||
else:
|
else:
|
||||||
value = self.value_as_type(value, df.type)
|
newvalue = None
|
||||||
|
emsg = None
|
||||||
|
einfo = None
|
||||||
|
try:
|
||||||
|
newvalue = self.value_as_type(value, df.type)
|
||||||
|
except TypeError as e:
|
||||||
|
emsg = "TypeError parsing value %s for %%s as %s" % (value, df.type)
|
||||||
|
einfo = sys.exc_info()[2]
|
||||||
|
except ValueError as e:
|
||||||
|
emsg = "ValueError parsing value %s for %%s as %s" % (value, df.type)
|
||||||
|
einfo = sys.exc_info()[2]
|
||||||
|
if emsg:
|
||||||
|
raise GameDataParseError(emsg, [bin.get('name')], einfo)
|
||||||
|
value = newvalue
|
||||||
|
|
||||||
node['_value'] = value
|
node['_value'] = value
|
||||||
elif bin.tag == 'attribute':
|
elif bin.tag == 'attribute':
|
||||||
|
@ -128,7 +152,7 @@ class XMLGameDataReader(object):
|
||||||
if value == None and df.opt:
|
if value == None and df.opt:
|
||||||
value = df.default
|
value = df.default
|
||||||
elif not value and not allow_missing:
|
elif not value and not allow_missing:
|
||||||
raise ValueError("Missing value for mandatory tag %s" % (bin.get('name'),))
|
raise GameDataParseError("Missing value for mandatory tag %s", [bin.get('name')])
|
||||||
elif not value:
|
elif not value:
|
||||||
value = None
|
value = None
|
||||||
else:
|
else:
|
||||||
|
@ -157,7 +181,7 @@ class XMLGameDataReader(object):
|
||||||
elif child.tag == 'attribute':
|
elif child.tag == 'attribute':
|
||||||
attrdict[child.get('name')] = child
|
attrdict[child.get('name')] = child
|
||||||
else:
|
else:
|
||||||
raise ValueError
|
raise GameDataParseError("Expected %%s to define children as either datatag or attribute, got %s instead", [xml.tag])
|
||||||
|
|
||||||
xmlattrdict = {}
|
xmlattrdict = {}
|
||||||
xmltagdict = {}
|
xmltagdict = {}
|
||||||
|
@ -165,7 +189,7 @@ class XMLGameDataReader(object):
|
||||||
if not isinstance(xml, MissingNode):
|
if not isinstance(xml, MissingNode):
|
||||||
for k, v in list(xml.items()):
|
for k, v in list(xml.items()):
|
||||||
if not k in attrdict:
|
if not k in attrdict:
|
||||||
raise ValueError("Key %s not a valid attribute: %s" % (k, list(attrdict.keys())))
|
raise GameDataParseError("Key %s on %%s not a valid attribute: %s" % (k, list(attrdict.keys())), [xml.tag])
|
||||||
continue
|
continue
|
||||||
binchild = attrdict[k]
|
binchild = attrdict[k]
|
||||||
xmlchild = xml
|
xmlchild = xml
|
||||||
|
@ -178,12 +202,24 @@ class XMLGameDataReader(object):
|
||||||
|
|
||||||
for child in xml.getchildren():
|
for child in xml.getchildren():
|
||||||
if not child.tag in tagdict:
|
if not child.tag in tagdict:
|
||||||
raise ValueError("Unrecognized tag %s" % (child.tag,))
|
raise GameDataParseError("Unrecognized tag %s under %%s" % (child.tag,), [xml.tag])
|
||||||
continue
|
continue
|
||||||
binchild = tagdict[child.tag]
|
binchild = tagdict[child.tag]
|
||||||
xmlchild = child
|
xmlchild = child
|
||||||
xmltagdict[child.tag] = 0
|
xmltagdict[child.tag] = 0
|
||||||
subnode = self.construct_recurse(binchild, xmlchild, allow_missing)
|
reraise_err = None
|
||||||
|
try:
|
||||||
|
subnode = self.construct_recurse(binchild, xmlchild, allow_missing)
|
||||||
|
except GameDataParseError as e:
|
||||||
|
einfo = sys.exc_info()[2]
|
||||||
|
if e.exc_info != None:
|
||||||
|
einfo = e.exc_info
|
||||||
|
reraise_err = GameDataParseError(e.msg, [xml.tag] + e.xpath, einfo)
|
||||||
|
reraise_err = reraise_err.with_traceback(einfo)
|
||||||
|
|
||||||
|
if reraise_err:
|
||||||
|
raise reraise_err
|
||||||
|
|
||||||
if subnode._def.multi:
|
if subnode._def.multi:
|
||||||
node.add_multi(child.tag, subnode)
|
node.add_multi(child.tag, subnode)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -39,18 +39,6 @@ class GameTimer(object):
|
||||||
self.framelist.append(elapsed)
|
self.framelist.append(elapsed)
|
||||||
|
|
||||||
|
|
||||||
def elapsed(self):
|
|
||||||
"""
|
|
||||||
get the amount of time in milliseconds passed since the last frame was displayed
|
|
||||||
"""
|
|
||||||
return self.elapsed
|
|
||||||
|
|
||||||
def elapsed_sec(self):
|
|
||||||
"""
|
|
||||||
get the amount of time in seconds passed since the last frame was displayed
|
|
||||||
"""
|
|
||||||
return self.elapsed_sec
|
|
||||||
|
|
||||||
def num_frames(self, delay, offset=0):
|
def num_frames(self, delay, offset=0):
|
||||||
"""
|
"""
|
||||||
if you want something to occur every "delay" milliseconds,
|
if you want something to occur every "delay" milliseconds,
|
||||||
|
@ -110,4 +98,4 @@ class GameTimer(object):
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,8 @@ class Model_Manager(object):
|
||||||
|
|
||||||
|
|
||||||
model = Model()
|
model = Model()
|
||||||
model.layers = [rl]
|
#model.layers = [rl]
|
||||||
|
model.add_sprite_layer(path, centered, antialias)
|
||||||
self.models[name] = model
|
self.models[name] = model
|
||||||
|
|
||||||
return model.instance()
|
return model.instance()
|
||||||
|
@ -69,6 +70,7 @@ class Model_Manager(object):
|
||||||
tt.initialize()
|
tt.initialize()
|
||||||
|
|
||||||
def get_texfile(self, path):
|
def get_texfile(self, path):
|
||||||
|
print("Getting texfile for %s" % (path,))
|
||||||
fp = files.mgr.canonize_path(path)
|
fp = files.mgr.canonize_path(path)
|
||||||
if not fp in self.texture_files:
|
if not fp in self.texture_files:
|
||||||
tf = TextureFile()
|
tf = TextureFile()
|
||||||
|
@ -460,7 +462,7 @@ class Model(object):
|
||||||
|
|
||||||
|
|
||||||
def add_sprite_layer(self, path, centered=False, antialiased=False, rot=0.0):
|
def add_sprite_layer(self, path, centered=False, antialiased=False, rot=0.0):
|
||||||
tf = self.get_texfile(path)
|
tf = mgr.get_texfile(path)
|
||||||
to = Texture()
|
to = Texture()
|
||||||
to.load_from_texfile(tf)
|
to.load_from_texfile(tf)
|
||||||
mat = Material()
|
mat = Material()
|
||||||
|
@ -468,8 +470,9 @@ class Model(object):
|
||||||
if antialiased:
|
if antialiased:
|
||||||
typeidx = enums.tt.diffuse
|
typeidx = enums.tt.diffuse
|
||||||
mat.textures[typeidx] = to
|
mat.textures[typeidx] = to
|
||||||
|
mat.texcoords = to.texcoords
|
||||||
|
|
||||||
rl = RenderLayer()
|
rl = RenderLayer(len(self.layers))
|
||||||
if centered:
|
if centered:
|
||||||
rl.mesh = SpriteMeshCentered()
|
rl.mesh = SpriteMeshCentered()
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -35,5 +35,15 @@ def init(videoinit):
|
||||||
def set_engine(new_engine):
|
def set_engine(new_engine):
|
||||||
roc_main.set_engine(new_engine)
|
roc_main.set_engine(new_engine)
|
||||||
|
|
||||||
|
def get_engine():
|
||||||
|
return roc_main.get_engine()
|
||||||
|
|
||||||
|
def set_timer(new_timer):
|
||||||
|
roc_main.set_timer(new_timer)
|
||||||
|
|
||||||
|
def get_timer():
|
||||||
|
return roc_main.get_timer()
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
roc_main.mainloop()
|
roc_main.mainloop()
|
||||||
|
|
|
@ -13,8 +13,19 @@ from OpenGL.GL import *
|
||||||
def set_engine(new_engine):
|
def set_engine(new_engine):
|
||||||
global g_engine
|
global g_engine
|
||||||
g_engine = new_engine
|
g_engine = new_engine
|
||||||
|
|
||||||
|
def set_timer(new_timer):
|
||||||
|
global g_timer
|
||||||
|
g_timer = new_timer
|
||||||
|
|
||||||
|
def get_engine():
|
||||||
|
return g_engine
|
||||||
|
|
||||||
|
def get_timer():
|
||||||
|
return g_timer
|
||||||
|
|
||||||
g_engine = None
|
g_engine = None
|
||||||
|
g_timer = None
|
||||||
|
|
||||||
|
|
||||||
def mainloop():
|
def mainloop():
|
||||||
|
|
Loading…
Add table
Reference in a new issue