Girando correctamente.

Hace mucho que no trabajamos en el juego, pero es que los examenes, las practicas, y el no tener ganas, hacen mucho daño. Hemos retomado el proyecto despues de un par de semanas, gracias a Edulix, que con su dark-extermination me ha motivado para que no abandone.

Así que sacando un poco de tiempo, que siempre hay, he arreglado un fallito que había cuando giraba el monigote. La cosa es que cuando giraba pegaba un salto extraño, y digo: “pues será que se cuela algún frame de por medio”. Pues sí, era eso:

En la función animate dentro de la clase AnimatedSprite, se comprueba que el frame por el que vamos no se sale de la animación:

 if self._frame >= len(self._animacion) + self._animacion[0]:
     self._frame = self._animacion[0]

Pero esto está mal, porque si self._frame == 0, no va a ser mayor, por lo que no se pone al primero de la animación, sino que se van pintando todos los frames desde el que estaba, hasta el primero de la animación.

Esto se puede arreglar comprobando que el frame está dentro de la animación:

 if not self._frame in self._animacion:
     self._frame = self._animacion[0]

Así ya no pasan cosas extrañas.

Otra cosa que he hecho es arreglar la carga de imagenes, cuando se pone con el flip. Porque para cargar la imagen invertida, giraba la original, y cargaba los frames de igual forma, cuando si hemos invertido la imagen original, tendremos que ir cargando frame a frame, pero invertido por columnas. Aquí está lo que he cambiado:

        if flip:
+            cols = range(columnas)
+            cols.reverse()
             for i in range(filas):
-                for j in range(columnas):
+                for j in cols:
                     aux_img = pygame.Surface((ancho, alto))
                     # el area para recortar
                     area = pygame.Rect(j*ancho, i*alto, ancho, alto)

Más cosas, en la clase Fighter he formalizado un poco el modo de indicar las animaciones. Ahora solo hay que indicar las animaciones en una dirección, para la otra dirección se modifican automáticamente.

        self.dir = 0
        self.parado = [0, 1, 2, 3, 4]
        self.andando = [5, 6, 7, 8, 9]
        self.saltando = [10,11,12]

self.dir indica la dirección, 0 imagenes por defecto, 1 invertido. Los otros tres indican los frames pertenecientes a las animaciones que hay por ahora.

Estas dos funciones son las que he implementado, para hacer un flip más o menos ordenado. Como las imagenes invertidas están a continuación de las originales, pues solo hay que sumarle el numero de frames iniciales a todas las animaciones, et voila!.

def change_dir(self, dir):
”’
cambia la orientacion del jugador
dir = 0 indica derecha
dir = 1 indica izquierda
”’
if self.dir == dir or not dir in [0,1]:
return False
else:
self.dir = dir
self.andando = map(self.masx, self.andando)
self.parado = map(self.masx, self.parado)
self.saltando = map(self.masx, self.saltando)
print self.andando, self.parado, self.saltando
return True

def masx(self, num):
”’
Sirve para cuando tenemos las imagenes invertidas,
si queremos los frames invertidos, tenemos que sumarle
el numero de imagenes a las animaciones
devuelve num + numimagenes si num < numimagenes num - numimagenes si num >= numimagenes
”’
if num < self.nimages: return num + self.nimages else: return num - self.nimages [/sourcecode]

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