Mercurial > touhou
diff pytouhou/game/effect.py @ 388:ac2891afb0bb
Make particles behave as in the original game.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 21 Oct 2012 23:02:40 +0200 |
parents | 690b5faaa0e6 |
children | c9433188ffdb |
line wrap: on
line diff
--- a/pytouhou/game/effect.py +++ b/pytouhou/game/effect.py @@ -16,7 +16,6 @@ from pytouhou.game.sprite import Sprite from pytouhou.vm.anmrunner import ANMRunner from pytouhou.utils.interpolator import Interpolator -from math import pi @@ -42,64 +41,30 @@ class Effect(object): -class Particle(object): - def __init__(self, start_pos, index, anm_wrapper, size, amp, game): - self._game = game +class Particle(Effect): + def __init__(self, pos, index, anm_wrapper, amp, game, reverse=False, duration=24): + Effect.__init__(self, pos, index, anm_wrapper) - self.sprite = Sprite() - self.sprite.anm, self.sprite.texcoords = anm_wrapper.get_sprite(index) - self.removed = False - self.objects = [self] - - self.x, self.y = start_pos self.frame = 0 - self.sprite.alpha = 128 - self.sprite.blendfunc = 1 - self.sprite.rescale = (size, size) + self.duration = duration - self.pos_interpolator = None - self.scale_interpolator = None - self.rotations_interpolator = None - self.alpha_interpolator = None - - self.amp = amp - + random_pos = (self.x + amp * game.prng.rand_double() - amp / 2, + self.y + amp * game.prng.rand_double() - amp / 2) - def set_end_pos(self, amp): - end_pos = (self.x + amp * self._game.prng.rand_double() - amp/2, - self.y + amp * self._game.prng.rand_double() - amp/2) - - self.pos_interpolator = Interpolator((self.x, self.y), 0, - end_pos, 24, formula=(lambda x: 2. * x - x ** 2)) - self.scale_interpolator = Interpolator(self.sprite.rescale, 0, - (0., 0.), 24) - self.rotations_interpolator = Interpolator(self.sprite.rotations_3d, 0, - (0., 0., 2*pi), 24) - self.alpha_interpolator = Interpolator((self.sprite.alpha,), 0, - (0.,), 24) + if not reverse: + self.pos_interpolator = Interpolator((self.x, self.y), 0, + random_pos, duration, formula=(lambda x: 2. * x - x ** 2)) + else: + self.pos_interpolator = Interpolator(random_pos, 0, + (self.x, self.y), duration, formula=(lambda x: 2. * x - x ** 2)) + self.x, self.y = random_pos def update(self): - if self.frame == 0: - self.set_end_pos(self.amp) - - if self.pos_interpolator: - self.pos_interpolator.update(self.frame) - self.x, self.y = self.pos_interpolator.values - - self.scale_interpolator.update(self.frame) - self.sprite.rescale = self.scale_interpolator.values + Effect.update(self) - self.rotations_interpolator.update(self.frame) - self.sprite.rotations_3d = self.rotations_interpolator.values - - self.alpha_interpolator.update(self.frame) - self.sprite.alpha, = self.alpha_interpolator.values - - self.sprite.changed = True - - if self.frame == 24: - self.removed = True + self.pos_interpolator.update(self.frame) + self.x, self.y = self.pos_interpolator.values self.frame += 1