# HG changeset patch # User Thibaut Girka # Date 1327266237 -3600 # Node ID 620134bc51f4f1c9d63105a7d84d98b22ae75808 # Parent 9b699e8de4a785bd716f30d2abb28f861e953d99 Move bullet visibility check to Bullet to improve performance and prepare handling of flags 1024 and 2048. diff --git a/pytouhou/game/bullet.pyx b/pytouhou/game/bullet.pyx --- a/pytouhou/game/bullet.pyx +++ b/pytouhou/game/bullet.pyx @@ -90,7 +90,7 @@ cdef class Bullet(object): self._sprite.angle = angle - def is_visible(self, screen_width, screen_height): + cpdef is_visible(Bullet self, screen_width, screen_height): tx, ty, tw, th = self._sprite.texcoords x, y = self.x, self.y @@ -105,7 +105,7 @@ cdef class Bullet(object): return True - def set_anim(self, sprite_idx_offset=None): + def set_anim(Bullet self, sprite_idx_offset=None): if sprite_idx_offset is not None: self.sprite_idx_offset = sprite_idx_offset @@ -120,7 +120,7 @@ cdef class Bullet(object): self._anmrunner.run_frame() - def launch(self): + def launch(Bullet self): self._state = LAUNCHED self.frame = 0 self.set_anim() @@ -130,11 +130,11 @@ cdef class Bullet(object): (self.speed,), 16) - def collide(self): + def collide(Bullet self): self.cancel() - def cancel(self): + def cancel(Bullet self): # Cancel animation bt = self._bullet_type self._sprite = Sprite() @@ -158,7 +158,7 @@ cdef class Bullet(object): self._game.cancelled_bullets.append(self) - def update(self): + def update(Bullet self): if self._anmrunner is not None and not self._anmrunner.run_frame(): if self._state == LAUNCHING: #TODO: check if it doesn't skip a frame @@ -248,3 +248,13 @@ cdef class Bullet(object): self.frame += 1 + # Filter out-of-screen bullets and handle special flags + #TODO: flags 1024 and 2048 + if self.flags & 448: + self._was_visible = False + elif self.is_visible(self._game.width, self._game.height): + self._was_visible = True + elif self._was_visible: + # Filter out-of-screen bullets + self._removed = True + diff --git a/pytouhou/game/game.py b/pytouhou/game/game.py --- a/pytouhou/game/game.py +++ b/pytouhou/game/game.py @@ -266,16 +266,6 @@ class Game(object): self.enemies = [enemy for enemy in self.enemies if not enemy._removed] # Filter out-of-scren bullets - # TODO: move to Bullet? - for bullet in chain(self.bullets, self.players_bullets): - if bullet.flags & 448: - bullet._was_visible = False - elif bullet.is_visible(self.width, self.height): - bullet._was_visible = True - elif bullet._was_visible: - # Filter out-of-screen bullets - bullet._removed = True - self.bullets = [bullet for bullet in self.bullets if not bullet._removed] self.players_bullets = [bullet for bullet in self.players_bullets