Limpiando el código

Como el otro día nos pusimos a programar de aquella manera, ya tocaba limpiar un poco el código. Lo que he hecho hoy es crear una nueva clase Fighter, que representará a un jugador, y hasta ahora estaba incrustada, sin ser una clase con entidad propia, dentro de AnimatedSprite.

Por lo tanto he separado el viejo AnimatedSprite en dos. En teoría ahora AnimatedSprite es más generíco, y se puede usar para muchas más cosas. Esta clase se encarga solamente de cargar una imagen, y de animarla. Está orientada para ser una clase padre de sprites animados.

AnimatedSprite se ha quedado solo con los metodos:

  • def __init__(self, image, filas, columnas, fps = 10), el constructor
  • def animate(self, t), el método animate, que cambia de frame segun el tiempo y fps. Se debería llamar cada vez que se llama a update de la clase hija y se quiere animar
  • def load(self, path, filas, columnas), carga la imagen, y crea el vector self._images, recortando la imagen original en frames segun las filas y las columnas
  • def set_frame(self, frame), pone un frame determinado de los posibles, self._images
  • def set_animation(self, animation), pone una animación, como la actual

Así pues he creado una nueva clase Fighter, que hereda de AnimatedSprite, y que es un luchador en concreto, con una velocidad, unas animaciones, etc. Quizás más adelante tengamos que crear clases que hereden de Fighter, puesto que queremos distintas clases de jugadores, con distintos movimientos, por lo que creo que esto sería la mejor opción.

De momento la clase Fighter es provisional, y tiene algunas propiedades del luchador que tenemos en concreto. Cuando tengamos más de un luchador habrá que separa en varias clases, y creo que la herencia sería la mejor opción.

# $Id$

import pygame
import AnimatedSprite

class Fighter(AnimatedSprite.AnimatedSprite):
    def __init__(self, image, filas, columnas, fps=10):
        AnimatedSprite.AnimatedSprite.__init__(self, image, filas, columnas, fps)
        # animaciones propias
        self.parado = [0, 1, 2, 3, 4]
        self.andando = [5, 6, 7, 8, 9]
        # la posicion en pantalla
        self.center = [100,100]
        self.rect.center = self.center
        # flags de estados
        # TODO hacer esto con binarios
        self.andando_derecha = False
        self.andando_izquierda = False
        # velocidad de movimiento horizontal
        self.velocidad = 5
        # velocidad de movimiento vertical
        self.vel_caida = 0
        # aceleracion de vel_caida
        self.gravedad = 0.7
        # posicion del suelo, en pixels
        self.suelo = 460

    def update(self):
        self.set_animation(self.parado)
        if self.andando_derecha or self.andando_izquierda:
            self.set_animation(self.andando)

        # Callendo
        if not self.en_suelo() or self.vel_caida < 0:
            if self.vel_caida  10:
                self.set_frame(12)
            else: self.set_frame(11)
            self.vel_caida += self.gravedad
            self.center[1] += self.vel_caida
        else: self.vel_caida = 0
        ###
        if self.en_suelo():
            self.animate(pygame.time.get_ticks())
        self.rect = self.image.get_rect()
        self.rect.center = self.center
            
        if self.andando_derecha:
            self.center[0] += self.velocidad
        elif self.andando_izquierda:
            self.center[0] -= self.velocidad


    def en_suelo(self):
        return self.rect.bottom >= self.suelo

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s