From 873cda73577edff8d50926abf3802a4b583b6eed Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Mon, 18 Sep 2017 01:57:17 -0400 Subject: [PATCH] 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 --- .hgignore | 1 + roc/anims.py | 25 ++++++++++++++---------- roc/files.py | 7 ++++++- roc/gamedata.py | 50 +++++++++++++++++++++++++++++++++++++++++------- roc/gametimer.py | 14 +------------- roc/models.py | 9 ++++++--- roc/roc_core.py | 10 ++++++++++ roc/roc_main.py | 11 +++++++++++ 8 files changed, 93 insertions(+), 34 deletions(-) diff --git a/.hgignore b/.hgignore index 3abbd1b..8aadf0f 100644 --- a/.hgignore +++ b/.hgignore @@ -7,3 +7,4 @@ include pip-selfcheck.json __pycache__ *.orig +share diff --git a/roc/anims.py b/roc/anims.py index 8331c83..8c1f984 100644 --- a/roc/anims.py +++ b/roc/anims.py @@ -1,7 +1,9 @@ import os -import files -import gametimer -import video +from . import files +from . import gametimer +from . import video +from . import models +from . import roc_main class anim(object): def __init__(self, frameset): @@ -13,7 +15,7 @@ class anim(object): self.done = False def update(self): - self.frame_timer -= gametimer.elapsed() + self.frame_timer -= roc_main.get_timer().elapsed while self.frame_timer <= 0: self.dirty = True self.frame += 1 @@ -33,8 +35,8 @@ class anim(object): return self.dirty - def draw(self, scr, pos): - self.frameset.draw(scr, pos, self.frame) + def draw(self): + self.frameset.draw(self.frame) self.dirty = False def size(self): @@ -51,8 +53,8 @@ class anim_frameset(object): self.frame_delays = [] self.set_delay(delay) - def load_frames(self, ifn): - ifn, ife = os.path.splitext(ifn) + def load_frames(self, iff): + ifn, ife = os.path.splitext(iff) fnp, fnn = os.path.split(ifn) if ifn and ifn[-1] == '1': self.frames = [] @@ -95,9 +97,12 @@ class anim_frameset(object): def size(self): - r = self.frames[0].get_rect() - return (r.w, r.h) + sc = self.frames[0].layers[0].scale + return int(sc[0]), int(sc[1]) + + def draw(self, frame): + self.frames[frame].render() """ def draw(self, scr, pos, frame): if scr != self.cached_surface: diff --git a/roc/files.py b/roc/files.py index 30ec322..423859b 100755 --- a/roc/files.py +++ b/roc/files.py @@ -26,7 +26,12 @@ class filemanager(object): return pygame.image.load(filename) 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(): global mgr diff --git a/roc/gamedata.py b/roc/gamedata.py index 4a22519..7f086a7 100755 --- a/roc/gamedata.py +++ b/roc/gamedata.py @@ -8,6 +8,17 @@ from . import files from . import shader 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): def __init__(self): self.text = None @@ -114,11 +125,24 @@ class XMLGameDataReader(object): elif (node.missing or value == None) and df.opt: value = df.default 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): value = None 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 elif bin.tag == 'attribute': @@ -128,7 +152,7 @@ class XMLGameDataReader(object): if value == None and df.opt: value = df.default 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: value = None else: @@ -157,7 +181,7 @@ class XMLGameDataReader(object): elif child.tag == 'attribute': attrdict[child.get('name')] = child else: - raise ValueError + raise GameDataParseError("Expected %%s to define children as either datatag or attribute, got %s instead", [xml.tag]) xmlattrdict = {} xmltagdict = {} @@ -165,7 +189,7 @@ class XMLGameDataReader(object): if not isinstance(xml, MissingNode): for k, v in list(xml.items()): 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 binchild = attrdict[k] xmlchild = xml @@ -178,12 +202,24 @@ class XMLGameDataReader(object): for child in xml.getchildren(): 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 binchild = tagdict[child.tag] xmlchild = child 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: node.add_multi(child.tag, subnode) else: diff --git a/roc/gametimer.py b/roc/gametimer.py index 7bd6a80..30e993c 100755 --- a/roc/gametimer.py +++ b/roc/gametimer.py @@ -39,18 +39,6 @@ class GameTimer(object): 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): """ if you want something to occur every "delay" milliseconds, @@ -110,4 +98,4 @@ class GameTimer(object): - \ No newline at end of file + diff --git a/roc/models.py b/roc/models.py index 5894aea..b02e175 100755 --- a/roc/models.py +++ b/roc/models.py @@ -37,7 +37,8 @@ class Model_Manager(object): model = Model() - model.layers = [rl] + #model.layers = [rl] + model.add_sprite_layer(path, centered, antialias) self.models[name] = model return model.instance() @@ -69,6 +70,7 @@ class Model_Manager(object): tt.initialize() def get_texfile(self, path): + print("Getting texfile for %s" % (path,)) fp = files.mgr.canonize_path(path) if not fp in self.texture_files: tf = TextureFile() @@ -460,7 +462,7 @@ class Model(object): 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.load_from_texfile(tf) mat = Material() @@ -468,8 +470,9 @@ class Model(object): if antialiased: typeidx = enums.tt.diffuse mat.textures[typeidx] = to + mat.texcoords = to.texcoords - rl = RenderLayer() + rl = RenderLayer(len(self.layers)) if centered: rl.mesh = SpriteMeshCentered() else: diff --git a/roc/roc_core.py b/roc/roc_core.py index f447cfa..da43b1d 100755 --- a/roc/roc_core.py +++ b/roc/roc_core.py @@ -35,5 +35,15 @@ def init(videoinit): def 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(): roc_main.mainloop() diff --git a/roc/roc_main.py b/roc/roc_main.py index dfe2ac0..3cec1a2 100755 --- a/roc/roc_main.py +++ b/roc/roc_main.py @@ -13,8 +13,19 @@ from OpenGL.GL import * def set_engine(new_engine): global g_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_timer = None def mainloop():