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:
cecilkorik 2017-09-18 01:57:17 -04:00
parent e74599be02
commit 873cda7357
8 changed files with 93 additions and 34 deletions

View file

@ -7,3 +7,4 @@ include
pip-selfcheck.json
__pycache__
*.orig
share

View file

@ -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:

View file

@ -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

View file

@ -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
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:

View file

@ -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,

View file

@ -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:

View file

@ -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()

View file

@ -14,7 +14,18 @@ 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():