Animación en actor al presionar una tecla [Resuelto]

Que tal comunidad,

Estoy probando el framework y estoy haciendo un personaje que tiene dos estados de animación, uno cuando dispara y otro normal, pero el resultado no es correcto. Ya use el buscador y leí el manual pero no he logrado hacer que funcione.

De los temas que ya busque se encuentran:
Error "Bad file descriptor" Este ocurre al hacer muchas llamadas a print
Como cambiar de imagen cuando el actor se queda parado - #2 by hugoruscitti Este sigue una logica similar a mi programa
Actor caminar al avanzar

Pero no me funcionaron.
Mi código es el siguiente:

     # coding: utf-8
import pilasengine
pilas = pilasengine.iniciar()
class MiAvion(pilasengine.actores.Actor):    
    def cuando_pulsa_tecla(self, t):
        if(t.codigo == 32):
            self.esta_disparando = True          
    def cuando_suelta_tecla(self, t):       
        if(t.codigo==32):
            self.esta_disparando = False
                        
    def iniciar(self):
        self.disparo = pilas.imagenes.cargar_grilla("avion_dispara.png", 5,1)
        self.volando = pilas.imagenes.cargar_grilla("avion.png",2,1)
        self.imagen = self.volando        
        self.pilas.eventos.pulsa_tecla.conectar(self.cuando_pulsa_tecla)
        self.pilas.eventos.pulsa_tecla.conectar(self.cuando_suelta_tecla)    
        self.esta_disparando = False
    def actualizar(self):           
        self.imagen.avanzar()
        if self.esta_disparando:
            self.imagen = self.disparo
        else:
            self.imagen = self.volando
            
                          	
fondo = pilas.fondos.Fondo()
fondo.imagen = "BG.png"
pilas.actores.vincular(MiAvion)
avion = pilas.actores.MiAvion()
avion.iniciar()
pilas.ejecutar()

Se agradece cualquier ayuda.
Saludos.

Buenas, @Jose_Manuel_Hernande !

Antes que nada, te recomiendo que leas este post para aprender a indexar bien tu código.

El código bien indexado nos ayuda a dar mejores respuestas!

Aunque el tema de las animaciones no son mi fuerte, ahí pude armarte tu ejemplo un poco rectificado.

Encontré varios errores menores pero que dificultaban la animación.[quote=“Jose_Manuel_Hernande, post:1, topic:1542”]
Este ocurre al hacer muchas llamadas a print
[/quote]

Este tema está aún sin resolver. Hasta que @hugoruscitti no encuentre una solución debemos intentar no sobrecargar las def actualizar(): con los print.

En cuanto a tu animación… Tu grilla tiene más de una fila??? Lo digo porque al definir (5,2) se entiende que tu grilla tiene 5 animaciones de ancho por 2 animaciones de alto. En mis pruebas he usado una grilla de 4x1 y otra de 2x1 (las puedes encontrar en el directorio data/imagenes/cooperativista)

Una cosa importante es que conectabas el pulsa_tecla a dos defs diferentes, por lo cual las dos se activaban al mismo tiempo :astonished: Te he cambiado la segunda por “suelta_tecla”, así al pulsar la barra espaciadora se activa la primera animación y al soltarla se activa la segunda.

Tambien he cambiado de lugar el self.imagen.avanzar() y le he dado un valor de 3 imagenes por segundo:

self.imagen.avanzar(3)

Espero que esto te ayude.

:wink:

# coding:scream:ine
pilas = pilasengine.iniciar()

class MiAvion(pilasengine.actores.Actor): 
	def cuando_pulsa_tecla(self, t):
		if(t.codigo == 32):
			self.esta_disparando = True 
	def cuando_suelta_tecla(self, t): 
		if(t.codigo==32):
			self.esta_disparando = False

	def iniciar(self):
		### Grilla que he probado: data/cooperativista
		### Esa grilla solo tiene una fila
		### por tanto solo necesito un valor
		self.disparo = pilas.imagenes.cargar_grilla("camina.png", 4)### antes 5,1
		self.volando = pilas.imagenes.cargar_grilla("trabajando.png",2)### antes 2,1
		self.imagen = self.volando        
		pilas.eventos.pulsa_tecla.conectar(self.cuando_pulsa_tecla)### self?
		### cambiado pulsa_tecla por suelta_tecla:
		pilas.eventos.suelta_tecla.conectar(self.cuando_suelta_tecla)### self?
		self.esta_disparando = False
	
	def actualizar(self):
		### Mejor ponerlo dentro de los IF:           
		###self.imagen.avanzar()
		if self.esta_disparando:
			self.imagen = self.disparo
			### Indicamos cuantas veces por segundo avanza la imagen, en este caso 3
			self.imagen.avanzar(3)
		else:
			self.imagen = self.volando
			### Indicamos cuantas veces por segundo avanza la imagen, en este caso 3
			self.imagen.avanzar(3)
			
fondo = pilas.fondos.Fondo()
###no tengo este fondo
#fondo.imagen = "BG.png"

pilas.actores.vincular(MiAvion)

avion = pilas.actores.MiAvion()

### !!!??? avion.iniciar()

pilas.ejecutar()

Que tal @jordinur, muchas gracias, logre resolver el problema.

Estaba en la conección del evento, pues estaba llamando de manera incorrecta a suelta_tecla

Saludos.