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