jueves, 6 de octubre de 2011

El Personaje

Bueno hoy vamos a crear un personaje que se mueva por nuestro mapa. Lo vamos a hacer inicialmente sin animaciones, solo que se mueva de celda en celda del mapa.


Inicialmente vamos a añadir un método en la clase Mapa para que nos devuelva la posición central de una celda del mismo.

class Mapa:

    ...

    def obtener_centro_celda(self, fila, columna):
        x = (self.tam_tiles[0] * columna) + (self.tam_tiles[0] / 2)
        y = (self.tam_tiles[1] * fila) + (self.tam_tiles[1] / 2)
        return (x,y)



Este método nos servirá para centrar el personaje en la celda en la que se encuentra.

Ahora vamos a crear la clase Personaje en un archivo en el directorio raíz llamado personaje.py.

# -*- coding: utf-8 -*-
from pygame.locals import *

from utilidades.imagen import *

class Personaje():

    TILE_ALTO = 32
    TILE_ANCHO = 32

    NORTE = 0
    SUR = 1
    ESTE = 2
    OESTE = 3

    def __init__(self, nombre, imagen):

        # Nombre identificativo del Personaje
        self.nombre = nombre

        # Tileset con la animación del personaje.
        self.tileset = cortar_tileset(imagen, (Personaje.TILE_ANCHO, Personaje.TILE_ALTO), False)

        self.direccion = Personaje.SUR
        self.direcciones = [[-1, 0], [ + 1, 0], [0,  + 1], [0, -1]] #N,S,E,O

        # Para dibujar el personaje.
        self.offset = (16,28)
        
        # Fila y columna donde se encuentra actualmente el personaje en el mapa.
        self.fila = 0
        self.columna = 0       

        self.animacion = [[0], [5], [1], [6]] #N,S,E,O
        
    def update(self):
        pass

    def dibujar(self, destino, coordenadas):
        # Obtenemos el cuadro que debemos dibujar dependiento de la orientación del personaje.
        cuadro_animacion = self.animacion[self.direccion][0]

        # Dibujamos el tile correspondiente.
        destino.blit(self.tileset[cuadro_animacion], (coordenadas[0] - self.offset[0], coordenadas[1] - self.offset[1]))

    def actualizar_posicion(self, (fila, columna)):        
        self.fila = fila
        self.columna = columna

    def mover(self, orientacion):

        if (orientacion != None):
            self.direccion = orientacion
            self.fila += self.direcciones[self.direccion][0]
            self.columna += self.direcciones[self.direccion][1]


Cosas importantes de esta clase son:

        self.direcciones = [[-1, 0], [1, 0], [0, 1], [0, -1]] #N,S,E,O

Aquí se establecen las distintas direcciones a las que puede mover el personaje. Por ejemplo hacia el Norte seria -1 fila y la columna se mantendría igual a 0.
Y así con todas las direcciones.

    self.offset = (16,28)

El Offset son las distancias del tile del personaje que queremos compensar para poder mostrarlo en el centro de la celda del mapa.


Como podéis ver la posición del personaje que deberá estar en el centro de la celda del mapa está a sus pies. He puesto un punto verde para que lo veáis.
Pues bien, ese punto se encuentra a 16 pixeles a la derecha de la esquina superior izquierda y a 28 de la parte superior de la imagen.

A la hora de dibujar el personaje deberemos restar estos valores a los que nos pasen, que en este caso serán el centro de la celda.

        # Dibujamos el tile correspondiente.
        destino.blit(self.tileset[cuadro_animacion], (coordenadas[0] - self.offset[0], coordenadas[1] - self.offset[1]))



Ahora solo queda añadir en el archivo pantallastate.py lo siguiente:

    from personaje import *
    ...
    def __init__(self, parent):
        ...
        self.personaje = Personaje('Jugador1','data/imagenes/jugador.png')
        self.personaje.actualizar_posicion((6,0))

    def handleEvents(self, events):
                ...
                elif event.key == pygame.K_UP :
                    self.personaje.mover(Personaje.NORTE)
                elif event.key == pygame.K_DOWN :
                    self.personaje.mover(Personaje.SUR)
                elif event.key == pygame.K_RIGHT :
                    self.personaje.mover(Personaje.ESTE)
                elif event.key == pygame.K_LEFT :
                    self.personaje.mover(Personaje.OESTE)
        
    def draw(self):
        ...
        self.mapa.dibujar(Mapa.LAYER_OBJETOS_SUPERPUESTOS, self.parent.screen,0,0)
        self.personaje.dibujar(self.parent.screen, self.mapa.obtener_centro_celda(self.personaje.fila, self.personaje.columna))
        self.mapa.dibujar(Mapa.LAYER_CIELO, self.parent.screen,0,0)
        ...


Ejecutamos el programa y ahora podremos mover a nuestro personaje por el mapa sin tener en cuenta las colisiones, eso para otro día.

Os dejo el enlace con el programa completo para que podais probarlo:
http://www.box.net/shared/m4hegm2bsqmb5vnmxgcv

No hay comentarios:

Publicar un comentario