X-Git-Url: https://git.yukkurigames.com/?p=python-bulletml.git;a=blobdiff_plain;f=bulletml%2Fimpl.py;fp=bulletml%2Fimpl.py;h=5d7cb54281eb340f8ee3c7fd5379baeb4b2ebc39;hp=6e8138a042bec6374d2a21de47a3c5efb9456e88;hb=76079fba9b913a620bb4fee71504d427e0f9df10;hpb=81982ba30dbf5fca59d8e90816ded81cb20da279 diff --git a/bulletml/impl.py b/bulletml/impl.py index 6e8138a..5d7cb54 100644 --- a/bulletml/impl.py +++ b/bulletml/impl.py @@ -2,11 +2,11 @@ from __future__ import division -import math +from math import atan2, sin, cos, pi as PI from bulletml import parser -PI_2 = math.pi * 2 +PI_2 = PI * 2 __all__ = ["Action", "Bullet"] @@ -68,7 +68,7 @@ class Action(object): self.previous_fire_direction = other.previous_fire_direction self.previous_fire_speed = other.previous_fire_speed - def step(self, owner, created, sin=math.sin, cos=math.cos): + def step(self, owner, created): """Advance by one frame.""" s_params = self.params rank = owner.rank @@ -123,18 +123,19 @@ class Action(object): child = self.__class__( owner, self, actions, params, rank, repeat) owner.replace(self, child) - child.step(owner, created, sin, cos) + child.step(owner, created) break elif isinstance(action, (parser.ActionDef, parser.ActionRef)): actions, params = action(s_params, rank) child = self.__class__(owner, self, actions, params, rank) owner.replace(self, child) - child.step(owner, created, sin, cos) + child.step(owner, created) break elif isinstance(action, (parser.FireDef, parser.FireRef)): - direction, speed, offset, tags, actions = action(s_params, rank) + direction, speed, offset, tags, appearance, actions = action( + s_params, rank) if direction: direction, type = direction if type == "aim" or type is None: @@ -174,10 +175,12 @@ class Action(object): x += off_x y += off_y + if appearance is None: + appearance = owner.appearance bullet = owner.__class__( x=x, y=y, direction=direction, speed=speed, target=owner.target, actions=actions, rank=rank, - tags=tags, Action=self.__class__) + appearance=appearance, tags=tags, Action=self.__class__) created.append(bullet) elif isinstance(action, parser.ChangeSpeed): @@ -209,7 +212,7 @@ class Action(object): direction += owner.aim - owner.direction # Normalize to [-pi, pi). - direction = (direction + math.pi) % PI_2 - math.pi + direction = (direction + PI) % PI_2 - PI if frames <= 0: owner.direction += direction else: @@ -262,10 +265,13 @@ class Action(object): owner.vanish() break + elif isinstance(action, parser.Appearance): + owner.appearance = action.appearance + else: - self.handle(action, owner, created, sin, cos) + self.handle(action, owner, created) - def handle(self, action, owner, created, sin, cos): + def handle(self, action, owner, created): """Override in subclasses for new action types.""" raise NotImplementedError(action.__class__.__name__) @@ -292,7 +298,8 @@ class Bullet(object): """ def __init__(self, x=0, y=0, direction=0, speed=0, target=None, - actions=(), rank=0.5, tags=(), Action=Action): + actions=(), rank=0.5, tags=(), appearance=None, + Action=Action): self.x = self.px = x self.y = self.py = y self.mx = 0 @@ -303,6 +310,7 @@ class Bullet(object): self.target = target self.rank = rank self.tags = set(tags) + self.appearance = appearance # New bullets reset the parent hierarchy. self._actions = [Action(self, None, action, params, rank) for action, params in actions] @@ -317,10 +325,10 @@ class Bullet(object): def __repr__(self): return ("%s(%r, %r, accel=%r, direction=%r, speed=%r, " - "actions=%r, target=%r, vanished=%r)") % ( + "actions=%r, target=%r, appearance=vanished=%r)") % ( type(self).__name__, self.x, self.y, (self.mx, self.my), self.direction, self.speed, self._actions, self.target, - self.vanished) + self.appearance, self.vanished) @property def aim(self): @@ -334,7 +342,7 @@ class Bullet(object): except AttributeError: return 0 else: - return math.atan2(target_x - self.x, self.y - target_y) + return atan2(target_x - self.x, target_y - self.y) @property def finished(self): @@ -373,7 +381,7 @@ class Bullet(object): else: self._actions[idx] = new - def step(self, sin=math.sin, cos=math.cos): + def step(self): """Advance by one frame. This updates the position and velocity, and may also set the @@ -384,11 +392,11 @@ class Bullet(object): created = [] for action in self._actions: - action.step(self, created, sin, cos) + action.step(self, created) self.px = self.x self.py = self.y self.x += self.mx + sin(self.direction) * self.speed - self.y += self.my - cos(self.direction) * self.speed + self.y += -self.my + cos(self.direction) * self.speed return created