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
|
||||
__pycache__
|
||||
*.orig
|
||||
share
|
||||
|
|
25
roc/anims.py
25
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:
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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():
|
||||
|
|
Loading…
Add table
Reference in a new issue