From 97141cbfbbae18076db7a1185ea46f23c412b620 Mon Sep 17 00:00:00 2001 From: Joe Wreschnig Date: Tue, 16 Mar 2010 00:04:37 -0700 Subject: [PATCH] Create Bullets from documents. --- bulletml/impl.py | 37 ++++++++++++++++++++++++++----------- bulletml/parser.py | 2 +- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/bulletml/impl.py b/bulletml/impl.py index c228a33..a0ef92c 100644 --- a/bulletml/impl.py +++ b/bulletml/impl.py @@ -88,9 +88,10 @@ class Action(object): if self.pc >= len(self.actions): self.repeat -= 1 if self.repeat <= 0: + self.pc = None if self.parent is not None: self.parent.copy_state(self) - self.owner.replace(self, self.parent) + self.owner.replace(self, self.parent) break else: self.pc = 0 @@ -106,7 +107,7 @@ class Action(object): break elif isinstance(action, (parser.ActionDef, parser.ActionRef)): - action, params = action(self.params, self.rank) + actions, params = action(self.params, self.rank) child = Action(self.owner, self, actions, params, self.rank) self.owner.replace(self, child) created.extend(child.step()) @@ -116,7 +117,7 @@ class Action(object): direction, speed, actions = action(self.params, self.rank) if direction: direction, type = direction - if type == "aim": + if type == "aim" or type is None: direction += self.owner.aim elif type == "sequence": direction += self.previous_fire_direction @@ -189,7 +190,7 @@ class Action(object): if type == "sequence": self.mx = mx elif type == "absolute": - self.mx = (mx - bullet.mx) / frames + self.mx = (mx - self.owner.mx) / frames elif type == "relative": self.mx = mx / frames if vertical: @@ -197,7 +198,7 @@ class Action(object): if type == "sequence": self.my = my elif type == "absolute": - self.my = (my - bullet.my) / frames + self.my = (my - self.owner.my) / frames elif type == "relative": self.my = my / frames @@ -215,7 +216,7 @@ class Bullet(object): """Simple bullet implementation.""" def __init__(self, x=0, y=0, direction=0, speed=0, target=None, - actions=(), parent=None): + actions=(), parent=None, rank=None): self.x = self.px = x self.y = self.py = y self.mx = 0 @@ -225,11 +226,11 @@ class Bullet(object): self.vanished = False self.target = target self.actions = [] - if actions and not parent: - raise errors.Error + if rank is None: + rank = parent.rank if parent else 0.5 for action, params in actions: self.actions.append( - Action(self, parent, action, params, parent.rank)) + Action(self, parent, action, params, rank)) def __repr__(self): return ("%s(%r, %r, accel=%r, direction=%r, speed=%r, " @@ -244,7 +245,12 @@ class Bullet(object): if self.target is None: return self.direction else: - return math.atan2(self.target.x - self.x, self.target.y - self.y) + return math.degrees( + math.atan2(self.target.x - self.x, self.target.y - self.y)) + + @property + def finished(self): + return self.vanished and not self.actions def vanish(self): """Vanish this bullet and stop all actions.""" @@ -264,11 +270,20 @@ class Bullet(object): def step(self): created = [] + self.actions = filter(None, self.actions) + for action in self.actions: created.extend(action.step()) - direction = math.degrees(self.direction) + direction = math.radians(self.direction) self.x += self.mx + math.sin(direction) * self.speed self.y += self.my + math.cos(direction) * self.speed return created + + @classmethod + def FromDoc(cls, doc, params=(), x=0, y=0, speed=0, direction=0, + target=None, rank=0.5): + actions = [act(params, rank) for act in doc.top] + return cls(x, y, direction, speed, target, actions, rank=rank) + diff --git a/bulletml/parser.py b/bulletml/parser.py index 8bea044..529876b 100644 --- a/bulletml/parser.py +++ b/bulletml/parser.py @@ -294,7 +294,7 @@ class FireDef(object): for subelem in element.getchildren(): tag = realtag(subelem) if tag == "direction": - self.direction = Direction(doc, subelem) + self.direction = Direction(doc, subelem, "aim") elif tag == "speed": self.speed = Speed(doc, subelem) elif tag == "bullet": -- 2.20.1