X-Git-Url: https://git.yukkurigames.com/?p=python-bulletml.git;a=blobdiff_plain;f=bulletml%2Fimpl.py;h=938e9e23ad85567a7a38c5a55d385af6cf5ba70f;hp=0548b9d1392f1c858bf71ebcc6723b1f8d22072d;hb=5da55ac7eeae21ee0ca3149bed99c95383397f05;hpb=bbceff0f5dafcfc18237d391da56790b57b74eee diff --git a/bulletml/impl.py b/bulletml/impl.py index 0548b9d..938e9e2 100644 --- a/bulletml/impl.py +++ b/bulletml/impl.py @@ -6,15 +6,22 @@ import math from bulletml import parser -# TODO(jfw): This is very non-Pythonic, it's pretty much just the -# BulletML reference ActionImpl translated to Python. - PI_2 = math.pi * 2 __all__ = ["Action", "Bullet"] class Action(object): - """Running action implementation.""" + """Running action implementation. + + To implement new actions, + + - Add a new element/class pair to parser.ActionDef.CONSTRUCTORS. + It should support FromXML, __getstate__, and __setstate__. + - Subclass impl.Action and override the 'handle' method to handle + your custom action type. + - Pass the impl.Bullet constructor your Action subclass when + creating your root Bullet. + """ def __init__(self, owner, parent, actions, params, rank, repeat=1): self.actions = actions @@ -61,9 +68,10 @@ class Action(object): self.previous_fire_direction = other.previous_fire_direction self.previous_fire_speed = other.previous_fire_speed - def step(self, owner, rank, created, sin=math.sin, cos=math.cos): + def step(self, owner, created, sin=math.sin, cos=math.cos): """Advance by one frame.""" s_params = self.params + rank = owner.rank if self.speed_frames > 0: self.speed_frames -= 1 @@ -112,16 +120,17 @@ class Action(object): if isinstance(action, parser.Repeat): repeat, (actions, params) = action(s_params, rank) - child = Action(owner, self, actions, params, rank, repeat) + child = self.__class__( + owner, self, actions, params, rank, repeat) owner.replace(self, child) - child.step(owner, rank, created, sin, cos) + child.step(owner, created, sin, cos) break elif isinstance(action, (parser.ActionDef, parser.ActionRef)): actions, params = action(s_params, rank) - child = Action(owner, self, actions, params, rank) + child = self.__class__(owner, self, actions, params, rank) owner.replace(self, child) - child.step(owner, rank, created, sin, cos) + child.step(owner, created, sin, cos) break elif isinstance(action, (parser.FireDef, parser.FireRef)): @@ -165,8 +174,8 @@ class Action(object): x += off_x y += off_y - bullet = Bullet( - x, y, direction, speed, owner.target, actions, self, rank) + bullet = owner.__class__( + x, y, direction, speed, owner.target, actions, rank) created.append(bullet) elif isinstance(action, parser.ChangeSpeed): @@ -251,6 +260,13 @@ class Action(object): owner.vanish() break + else: + self.handle(action, owner, created, sin, cos) + + def handle(self, action, owner, created, sin, cos): + """Override in subclasses for new action types.""" + raise NotImplementedError(action.__class__.__name__) + class Bullet(object): """Simple bullet implementation. @@ -274,7 +290,7 @@ class Bullet(object): """ def __init__(self, x=0, y=0, direction=0, speed=0, target=None, - actions=(), parent=None, rank=0.5): + actions=(), rank=0.5, Action=Action): self.x = self.px = x self.y = self.py = y self.mx = 0 @@ -352,7 +368,7 @@ class Bullet(object): created = [] for action in self._actions: - action.step(self, self.rank, created, sin, cos) + action.step(self, created, sin, cos) self.px = self.x self.py = self.y