# HG changeset patch # User Thibaut Girka # Date 1318325373 -7200 # Node ID 7e7368356445ded628637cf6d131339838daa70c # Parent 606468ab4f7b7355deef8b64757aa0b9b571d028 Add bullet cancel anim support diff --git a/pytouhou/game/bullet.py b/pytouhou/game/bullet.py --- a/pytouhou/game/bullet.py +++ b/pytouhou/game/bullet.py @@ -108,8 +108,24 @@ class Bullet(object): def collide(self): - #TODO: animation - self._removed = True + self.cancel() + + + def cancel(self): + # Cancel animation + bt = self._bullet_type + self._sprite = Sprite() + self._sprite.angle = self.angle + self._anmrunner = ANMRunner(bt.anm_wrapper, bt.cancel_anim_index, + self._sprite, bt.launch_anim_offsets[self.sprite_idx_offset]) + self._anmrunner.run_frame() + + # Change update method + self.update = self.update_cancel + + # Do not use this one for collisions anymore + self._game.bullets.remove(self) + self._game.cancelled_bullets.append(self) def update(self): @@ -121,6 +137,15 @@ class Bullet(object): self.launch() + def update_cancel(self): + dx, dy = self.delta + self.x += dx + self.y += dy + + if not self._anmrunner.run_frame(): + self._removed = True + + def update_simple(self): dx, dy = self.delta self.x += dx diff --git a/pytouhou/game/game.py b/pytouhou/game/game.py --- a/pytouhou/game/game.py +++ b/pytouhou/game/game.py @@ -36,6 +36,7 @@ class Game(object): self.players = [Player(player_state, characters[player_state.character]) for player_state in player_states] self.enemies = [] self.bullets = [] + self.cancelled_bullets = [] self.items = [] self.stage = stage @@ -78,6 +79,7 @@ class Game(object): # 2. Filter out destroyed enemies self.enemies = [enemy for enemy in self.enemies if not enemy._removed] self.bullets = [bullet for bullet in self.bullets if not bullet._removed] + self.cancelled_bullets = [bullet for bullet in self.cancelled_bullets if not bullet._removed] self.items = [item for item in self.items if not item._removed] # 3. Let's play! @@ -99,6 +101,9 @@ class Game(object): for bullet in self.bullets: bullet.update() + for bullet in self.cancelled_bullets: + bullet.update() + for item in self.items: item.update() @@ -161,6 +166,7 @@ class Game(object): # Filter out-of-scren bullets # TODO: was_visible thing self.bullets = [bullet for bullet in self.bullets if bullet.is_visible(384, 448)] + self.cancelled_bullets = [bullet for bullet in self.cancelled_bullets if bullet.is_visible(384, 448)] # Disable boss mode if it is dead/it has timeout if self.boss and self.boss._removed: diff --git a/pytouhou/opengl/gamerenderer.pyx b/pytouhou/opengl/gamerenderer.pyx --- a/pytouhou/opengl/gamerenderer.pyx +++ b/pytouhou/opengl/gamerenderer.pyx @@ -152,6 +152,7 @@ cdef class GameRenderer: self.render_elements(game.enemies) self.render_elements(game.players) self.render_elements(game.bullets) + self.render_elements(game.cancelled_bullets) self.render_elements(game.items) #TODO: display item indicators glEnable(GL_FOG)