sábado, 8 de octubre de 2011

Colisiones del personaje con el mapa

Hoy vamos a detectar las colisiones con el mapa y no permitir el movimiento en las zonas no "pisables".

Para ello vamos a usar la capa llamada "Pisable" que creamos con las X rojas para indicar que por allí no se podría pasar.


Primero en la clase Mapa (mapa.py) vamos a crear un método que nos dirá si se puede pisar o no en la celda indicada.

def es_pisable(self, fila, columna):
        # Si se intenta mover fuera del mapa, no se permite
        if ((fila >= self.height) or (fila < 0) or (columna >= self.width) or (columna < 0)):
            return False
        else:
            return not (self.capas[Mapa.LAYER_PISABLE][fila][columna])

Las partes del mapa que no tienen una X roja contienen un valor 0 y las que la tienen contienen un 1.
Por ello retornado "not (self.capas[Mapa.LAYER_PISABLE][fila][columna])" nos devolverá True o False dependiendo de si hay una X o no.

Ahora en la clase Personaje (personaje.py) añadiremos el siguiente metodo

def cambiar_direccion(self, direccion):
        self.direccion = direccion

Este método lo creamos porque aunque el personaje no pueda mover a esa celda, por lo menos se pondrá en dirección a ella.


Ahora ya vamos al archivo pantallastate.py y añadimos y modificamos lo siguiente.
Fijaros que el método handleEvents ha cambiado, ahora SOLO indicamos hacia donde queremos mover.

def __init__(self, parent):
        ...
        self.mover_personaje = None

    def handleEvents(self, events):
        for event in events:
            if event.type == pygame.KEYDOWN :
                if event.key == pygame.K_ESCAPE :
                    self.parent.popState()
                elif event.key == pygame.K_UP :
                    self.mover_personaje = Personaje.NORTE                    
                elif event.key == pygame.K_DOWN :
                    self.mover_personaje = Personaje.SUR
                elif event.key == pygame.K_RIGHT :
                    self.mover_personaje = Personaje.ESTE
                elif event.key == pygame.K_LEFT :
                    self.mover_personaje = Personaje.OESTE

    def update(self):
        # Si se ha intentado mover al personaje
        if (self.mover_personaje != None):
            # Comprobamos que la celda donde va a mover es pisable
            if (self.mapa.es_pisable(self.personaje.fila + self.personaje.direcciones[self.mover_personaje][0],self.personaje.columna + self.personaje.direcciones[self.mover_personaje][1])):
                # Si es asi lo movemos
                self.personaje.mover(self.mover_personaje)
            else:
                # Solo cambiamos las direccion pero sin moverlo
                self.personaje.cambiar_direccion(self.mover_personaje)

            self.mover_personaje = None


Si os fijáis en el método update es donde controlamos la colisión.
Comprobamos con el método es_pisable del Mapa, si las celdas donde se desea mover el personaje son pisables o no.

La formula para la obtención de la fila y columna destino, es igual que la que se usa en el método mover de la clase Personaje.

Bueno ahora ya podremos mover al personaje y que colisione con los objetos.

Prueba ha crear nuevos obstáculos y objetos por el mapa. ¡ Inténtalo !


No hay comentarios:

Publicar un comentario