hugoruscitti/pilas

View on GitHub
pilasengine/imagenes/animacion.py

Summary

Maintainability
A
1 hr
Test Coverage
# -*- encoding: utf-8 -*-
# pilas engine: un motor para hacer videojuegos
#
# Copyright 2010-2014 - Hugo Ruscitti
# License: LGPLv3 (see http://www.gnu.org/licenses/lgpl.html)
#
# Website - http://www.pilas-engine.com.ar
import os

from grilla import Grilla

class Animacion(Grilla):

    def __init__(self, pilas, ruta, columnas=1, filas=1):
        Grilla.__init__(self, pilas, ruta, columnas, filas)
        self.animaciones = {}
        self.animacion_en_curso = None
        self.cuadro_en_la_animacion = 0
        self._ticks_acumulados = 0
        self.definir_animacion('inicial', [0], 1)
        self.cargar_animacion('inicial')

    def definir_animacion(self, nombre, cuadros, velocidad):
        self.animaciones[nombre] = (cuadros, velocidad)

    def cargar_animacion(self, nombre):
        if self.animacion_en_curso != self.animaciones[nombre]:
            self._ticks_acumulados = 0
            self.animacion_en_curso = self.animaciones[nombre]
            self.cuadro_en_la_animacion = 0
            self.definir_cuadro(self.animacion_en_curso[0][self.cuadro_en_la_animacion])

    def avanzar(self, velocidad=None):
        if velocidad:
            raise Exception("Tienes que definir la velocidad usando 'definir_animacion' no llamando al metodo avanzar con un numero.")

        if self.animacion_en_curso is None:
            raise Exception("Tienes que definir al menos una animacion inicial.")

        velocidad_de_animacion = (1000.0 / 60) * self.animacion_en_curso[1]
        self._ticks_acumulados += velocidad_de_animacion
        ha_avanzado = True

        if self._ticks_acumulados > 1000.0:
            self._ticks_acumulados -= 1000.0

            if self.cuadro_en_la_animacion >= len(self.animacion_en_curso[0]):
                self.cuadro_en_la_animacion = 0
                ha_avanzado = False

            self.definir_cuadro(self.animacion_en_curso[0][self.cuadro_en_la_animacion])
            self.cuadro_en_la_animacion += 1

        return ha_avanzado

    def __repr__(self):
        nombre_imagen = os.path.basename(self.ruta_original)
        return "<Animacion del archivo '%s' (filas: %d, columnas: %d)>" % (nombre_imagen, self.filas, self.columnas)