view pytouhou/game/effect.py @ 181:184196480f59

Don’t use the useless eff00.anm and implement particles (grazing, death, and more).
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 23 Oct 2011 14:50:44 -0700
parents 35d850502d1f
children dbe6b7b2d3fc
line wrap: on
line source

# -*- encoding: utf-8 -*-
##
## Copyright (C) 2011 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published
## by the Free Software Foundation; version 3 only.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##


from pytouhou.game.sprite import Sprite
from pytouhou.vm.anmrunner import ANMRunner
from pytouhou.utils.interpolator import Interpolator
from math import pi



class Effect(object):
    def __init__(self, pos, index, anm_wrapper):
        self._sprite = Sprite()
        self._anmrunner = ANMRunner(anm_wrapper, index, self._sprite)
        self._anmrunner.run_frame()
        self._removed = False

        self.x, self.y = pos


    def update(self):
        if self._anmrunner and not self._anmrunner.run_frame():
            self._anmrunner = None

        if self._sprite:
            if self._sprite._removed:
                self._sprite = None


class Particle(object):
    def __init__(self, start_pos, index, anm_wrapper, size, end_pos):
        self._sprite = Sprite()
        self._sprite.anm, self._sprite.texcoords = anm_wrapper.get_sprite(index)
        self._removed = False

        self.x, self.y = start_pos
        self.frame = 0
        self._sprite.alpha = 128
        self._sprite.blendfunc = 1

        self.pos_interpolator = Interpolator(start_pos, 0,
                                             end_pos, 24, formula=(lambda x: 2. * x - x ** 2))
        self.scale_interpolator = Interpolator((size, size), 0,
                                               (0., 0.), 24)
        self.rotations_interpolator = Interpolator((0., 0., 0.), 0,
                                                   (0., 0., 2*pi), 24)
        self._sprite._changed = True


    def update(self):
        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

        self.rotations_interpolator.update(self.frame)
        self._sprite.rotations_3d = self.rotations_interpolator.values

        self._sprite._changed = True

        if self.frame == 24:
            self._removed = True

        self.frame += 1