hugoruscitti/pilas

View on GitHub
pilasengine/habilidades/moverse_con_el_teclado.py

Summary

Maintainability
D
2 days
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 math

from pilasengine import habilidades


class MoverseConElTeclado(habilidades.Habilidad):
    """Hace que un actor cambie de posición con pulsar el teclado."""

    def iniciar(self, receptor, control=None, direcciones=8, velocidad_maxima=4,
                aceleracion=1, deceleracion=0.1, con_rotacion=False,
                velocidad_rotacion=1, marcha_atras=True):
        """Inicializa la habilidad.

        :param receptor: Referencia al actor que aprenderá la habilidad.
        :param control: Control al que va a responder para mover el Actor.
        :param direcciones: Establece si puede mover en cualquier direccion o
                            unicamente en 4 direcciones arriba, abajo,
                            izquierda y derecha. El parametro con_rotacion
                            establece las direcciones a 8 direcciones siempre.
        :param velocidad_maxima: Velocidad maxima en pixeles a la que se moverá
                                 el Actor.
        :param aceleracion: Indica lo rapido que acelera el actor hasta su
                            velocidad máxima.
        :param deceleracion: Indica lo rapido que decelera el actor hasta parar.
        :param con_rotacion: Si deseas que el actor rote pulsando las teclas
                             de izquierda y derecha.
        :param velocidad_rotacion: Indica lo rapido que rota un actor sobre
                                   si mismo.
        :param marcha_atras: Posibilidad de ir hacia atrás. (True o False)
        """

        super(MoverseConElTeclado, self).iniciar(receptor)

        if control is None:
            self.control = self.pilas.escena_actual().control
        else:
            self.control = control

        if not direcciones is 8 and not direcciones is 4:
            raise Exception("El parametro direcciones solo admite:\
                            el numero 4 u 8")
        else:
            self.direcciones = direcciones

        self.velocidad = 0
        self.deceleracion = deceleracion
        self._velocidad_maxima = velocidad_maxima
        self._aceleracion = aceleracion
        self.con_rotacion = con_rotacion
        self.velocidad_rotacion = velocidad_rotacion
        self.marcha_atras = marcha_atras

    def set_velocidad_maxima(self, velocidad):
        self._velocidad_maxima = velocidad

    def get_velocidad_maxima(self):
        return self._velocidad_maxima

    def get_aceleracion(self):
        return self._aceleracion

    def set_aceleracion(self, aceleracion):
        self._aceleracion = aceleracion

    velocidad_maxima = property(get_velocidad_maxima, set_velocidad_maxima,
                                doc="Define la velocidad maxima.")
    aceleracion = property(get_aceleracion, set_aceleracion,
                           doc="Define la acelaracion.")

    def actualizar(self):
        if self.con_rotacion:
            self.mover_con_rotacion()
        else:
            self.mover()

    def mover_con_rotacion(self):
        if self.control.izquierda:
            self.receptor.rotacion += (self.velocidad_rotacion *
                                       self.velocidad_maxima)
        elif self.control.derecha:
            self.receptor.rotacion -= (self.velocidad_rotacion *
                                       self.velocidad_maxima)

        if self.control.arriba:
            self.avanzar(+1)
        elif self.control.abajo:
            if self.marcha_atras:
                self.avanzar(-1)
            else:
                self.decelerar()
        else:
            self.decelerar()

        rotacion_en_radianes = math.radians(self.receptor.rotacion + 90)
        dx = math.cos(rotacion_en_radianes) * self.velocidad
        dy = math.sin(rotacion_en_radianes) * self.velocidad
        self.receptor.x += dx
        self.receptor.y += dy

    def mover(self):
        if self.direcciones == 8:
            if self.control.izquierda:
                self.receptor.x -= self.velocidad_maxima
            elif self.control.derecha:
                self.receptor.x += self.velocidad_maxima

            if self.control.arriba:
                self.receptor.y += self.velocidad_maxima
            elif self.control.abajo:
                if self.marcha_atras:
                    self.receptor.y -= self.velocidad_maxima
        else:
            if self.control.izquierda:
                self.receptor.x -= self.velocidad_maxima
            elif self.control.derecha:
                self.receptor.x += self.velocidad_maxima
            elif self.control.arriba:
                self.receptor.y += self.velocidad_maxima
            elif self.control.abajo:
                if self.marcha_atras:
                    self.receptor.y -= self.velocidad_maxima

    def decelerar(self):
        if self.velocidad > self.deceleracion:
            self.velocidad -= self.deceleracion
        elif self.velocidad < -self.deceleracion:
            self.velocidad += self.deceleracion
        else:
            self.velocidad = 0

    def avanzar(self, delta):
        self.velocidad += self.aceleracion * delta
        if self.velocidad > self.velocidad_maxima:
            self.velocidad = self.velocidad_maxima
        elif self.velocidad < - self.velocidad_maxima / 2:
            self.velocidad = - self.velocidad_maxima / 2