Problemas para definir una actor

bueno hola de nuevo :smile: eh tenido un pequeño problema con una parte del juego que me dice :

 Traceback (most recent call last):
  File "proyecto2.py", line 42, in <module>
    class EscenaJuego(pilasengine.escenas.Escena):
  File "proyecto2.py", line 118, in EscenaJuego
    pilas.actores.vincular(Stickman)
NameError: name 'Stickman' is not defined

pero lo que no entiendo que porque me sale ese error si lo eh definido
acá una parte del código por las dudas:

                pilas.actores.vincular(Stickman)
                pilas.actores.vincular(enemigos)

                jugador = pilas.actores.Stickman(y = -100 , x = 200 , imagen = "/home/jemf/Escritorio/juego/sprites/stickman/stickman.png" )
                jugador.escala = 0.5
                teclas = {
                            pilas.simbolos.a: 'izquierda',
                            pilas.simbolos.d: 'derecha' ,
                            pilas.simbolos.w: 'arriba' ,
                            pilas.simbolos.g: 'boton' ,
                            pilas.simbolos.h: 'boton2'}
                mi_control = pilas.control.Control(teclas)

Hola @jemf!!, ¿Nos podrías colocar la parte de código en donde está definida la clase Stickman?

¿Puede ser un tema de mayúsculas y minúsculas?

Por cierto, ¿estás siguiendo estas instrucciones para crear el actor personalizado?: Actores personalizados - pilas-engine

ok, y con lo de los actores personalizados me guie mucho por tu juego para crearlos, acá el código:

class Stickman(pilasengine.actores.Actor):

def iniciar(self, x=0, y=0, imagen=None, imagen2=None, control=None):
    self.x = x
    self.y = y
    if control:
        self.control = control
    else:
        self.control = self.pilas.control
    if imagen:
        self.path_img = imagen
    elif imagen:
        self.imagen ="/home/jemf/Escritorio/juego/sprites/stickman/stickman.png"
    if imagen2:
        self.path_img2 = imagen2
    elif imagen2:
        self.path_img2 = "/home/jemf/Escritorio/juego/sprites/stickman/corre.png"
    self.hacer_inmediatamente(Parado)
    self.altura_del_salto = 0
#def cuando_pulsa_una_tecla(self, evento):
    #elif evento.codigo == pilas.simbolos.d:
        #self.comportamiento_actual.pulsa_golpear()

class Parado(Comportamiento):

def iniciar(self, receptor):
    self.receptor = receptor
    self.control = receptor.control
    self.receptor.imagen = self.pilas.imagenes.cargar_grilla(self.receptor.path_img)
    self.receptor.centro = ("centro", "abajo")

def actualizar(self):
    self.receptor.imagen.avanzar(10)

    if self.control.derecha or self.control.izquierda:
        self.receptor.hacer_inmediatamente(Caminar)
    if self.control.arriba:
        self.receptor.hacer_inmediatamente(Saltar)
    if self.control.boton:
        self.receptor.hacer_inmediatamente(Pegar)
    if self.control.boton2:
        self.receptor.hacer_inmediatamente(Patada)

class Caminar(Comportamiento):

def iniciar(self, receptor):
    self.receptor = receptor
    self.control = receptor.control

    self.receptor.imagen = self.pilas.imagenes.cargar_grilla(self.receptor.path_img2, 4, 1)
    self.receptor.centro = ("centro", "abajo")

def actualizar(self):
    self.receptor.imagen.avanzar(10)

    # Si pulsa a los costados se puede mover.
    if self.control.derecha:
        self.receptor.x += 5
        self.receptor.espejado = False
    elif self.control.izquierda:
        self.receptor.x -= 5
        self.receptor.espejado = True

    # Si pulsa hacia arriba salta.
    if self.control.arriba:
        self.receptor.hacer_inmediatamente(Saltar)
    if self.control.boton:
        self.receptor.hacer_inmediatamente(Pegar)
    if self.control.boton2:
        self.receptor.hacer_inmediatamente(Pegar)
    # Si suelta las teclas regresa al estado inicial.
    if not self.control.derecha and not self.control.izquierda:
        self.receptor.hacer_inmediatamente(Parado)

class Saltar(Comportamiento):

def iniciar(self, receptor):
    self.receptor = receptor
    self.control = receptor.pilas.control

    self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/salto.png", 3, 1)
    self.receptor.centro = ("centro", "abajo")
    self.y_inicial = self.receptor.y
    self.vy = 15

def actualizar(self):
    self.receptor.y += self.vy
    self.vy -= 0.7

    distancia_al_suelo = self.receptor.y - self.y_inicial
    self.receptor.altura_del_salto = distancia_al_suelo

    # Cuando llega al suelo, regresa al estado inicial.
    if distancia_al_suelo < 0:
        self.receptor.y = self.y_inicial
        self.receptor.altura_del_salto = 0
        self.receptor.hacer_inmediatamente(Parado)

    # Si pulsa a los costados se puede mover.
    if self.control.derecha:
        self.receptor.x += 5
        self.receptor.espejado = False
    elif self.control.izquierda:
        self.receptor.x -= 5
        self.receptor.espejado = True

class Golpear (Comportamiento):
ha_golpeado = False
numero_de_ataque = 0
def iniciar(self, receptor):
self.receptor = receptor
self.control = receptor.pilas.control

    if evento.codigo == pilas.simbolos.boton:
        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/puno.png", 3, 1)
        self.receptor.centro = ("centro", "abajo")

    def actualizar(self):
        if self.receptor.avanzar_animacion(0.4):
            self.receptor.hacer(Parado())
            self.eliminar_golpe()
        else:
            if self.golpe:
                enemigo = self.golpe.verificar_colisiones()
            if enemigo:
                self.eliminar_golpe()

                ataque_fuerte = (self.numero_de_ataque == 4)
                enemigo.ha_sido_golpeado(self.shaolin, fuerte=ataque_fuerte)
                Golpear.ha_golpeado = True
            else:
                Golpear.ha_golpeado =False
def ha_sido_golpeado(self, otro_actor, fuerte):
    self._pasa_a_estado_golpeado()
def __init__(self, actor, enemigos, dx, dy):
    pilas.actores.Actor.__init__(self)
    self.actor = actor
    self.dx = dx
    self.dy = dy
    self.enemigos = enemigos
    self.actualizar()

def actualizar(self):
    if self.actor.espejado:
        self.x = self.actor.x - 70 - self.dx
    else:
        self.x = self.actor.x + 70 + self.dx

    self.y = self.actor.y + self.actor.altura_del_salto + self.dy

def verificar_colisiones(self):
    for enemigo in self.enemigos:

        area = [
                enemigo.izquierda + 10,
                enemigo.derecha - 10,
                enemigo.abajo,
                enemigo.arriba,
               ]

        if enemigo.puede_ser_golpeado:
            if area[0] < self.x < area[1] and area[2] < self.y < area[3]:
                if abs(enemigo.y - self.actor.y) < 15:
                    if enemigo.altura_del_salto < 80:
                        self.crear_efecto_de_golpe()
                        return enemigo

def dibujar(self, aplicacion):
    if DEPURACION:
        pilas.actores.Actor.dibujar(self, aplicacion)

def crear_efecto_de_golpe(self):
    dx = random.randint(-10, 10)
    dy = random.randint(-10, 10)
    efecto_golpe.EfectoGolpe(self.x + dx, self.y + dy)

class Patada (Comportamiento):
ha_golpeado = False
numero_de_ataque = 0
def iniciar(self, receptor):
self.receptor = receptor
self.control = receptor.pilas.control

    if evento.codigo == pilas.simbolos.boton2:
        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/patada.png", 3, 1)
        self.receptor.centro = ("centro", "abajo")

    def actualizar(self):
        if self.receptor.avanzar_animacion(0.4):
            self.receptor.hacer(Parado())
            self.eliminar_golpe()
        else:
            if self.golpe:
                enemigo = self.golpe.verificar_colisiones()
            if enemigo:
                self.eliminar_golpe()

                ataque_fuerte = (self.numero_de_ataque == 4)
                enemigo.ha_sido_golpeado(self.shaolin, fuerte=ataque_fuerte)
                Golpear.ha_golpeado = True
            else:
                Golpear.ha_golpeado =False
def ha_sido_golpeado(self, otro_actor, fuerte):
    self._pasa_a_estado_golpeado()
def __init__(self, actor, enemigos, dx, dy):
    pilas.actores.Actor.__init__(self)
    self.actor = actor
    self.dx = dx
    self.dy = dy
    self.enemigos = enemigos
    self.actualizar()

def actualizar(self):
    if self.actor.espejado:
        self.x = self.actor.x - 70 - self.dx
    else:
        self.x = self.actor.x + 70 + self.dx

    self.y = self.actor.y + self.actor.altura_del_salto + self.dy

def verificar_colisiones(self):
    for enemigo in self.enemigos:

        area = [
                enemigo.izquierda + 10,
                enemigo.derecha - 10,
                enemigo.abajo,
                enemigo.arriba,
               ]

        if enemigo.puede_ser_golpeado:
            if area[0] < self.x < area[1] and area[2] < self.y < area[3]:
                if abs(enemigo.y - self.actor.y) < 15:
                    if enemigo.altura_del_salto < 80:
                        self.crear_efecto_de_golpe()
                        return enemigo

def dibujar(self, aplicacion):
    if DEPURACION:
        pilas.actores.Actor.dibujar(self, aplicacion)

def crear_efecto_de_golpe(self):
    dx = random.randint(-10, 10)
    dy = random.randint(-10, 10)
    efecto_golpe.EfectoGolpe(self.x + dx, self.y + dy)

perdon, lo de depuracion no va :sweat_smile:

hola, si,“creo” que lo pude solucionar pero me dio atro error que no se que significa:

AttributeError: ‘function’ object has no attribute ‘vincular’

si alguien sabe se lo agradecería mucho

¿Nos enviarías el código completo @jemf?

ok, acá va el código:

import pilasengine
from pilasengine.actores.actor import Actor
from pilasengine.comportamientos.comportamiento import Comportamiento
import random

pilas = pilasengine.iniciar()

pilas = pilasengine.iniciar(ancho = 1280, alto = 700)


class EscenaMenu(pilasengine.escenas.Escena):
                def iniciar(self):
                    fondo = pilas.fondos.Fondo()
                    fondo.imagen = pilas.imagenes.cargar("/home/jemf/Escritorio/Proyecto Juego/fondos/fondo2.jpg")

                    ##############################################
                    self.Mi_Menu = pilas.actores.Menu(
	                   [
		                     (u'IR  AL JUEGO', self.Ir_al_juego),
		                     (u'HISTORIA DEL JUEGO' , self.Historia_del_juego),
		                     (u'SALIR DE PILAS', self.Salir_de_Pilas)
	                   ])
                    ##############################################

                    Nombre_de_mi_juego = pilas.actores.Texto(u'VENGANZA')
                    Nombre_de_mi_juego.color = pilas.colores.blanco
                    Nombre_de_mi_juego.y = 170

                def actualizar(self):
                    pass
                def Salir_de_Pilas(self):
                    pilas.terminar()
                def Ir_al_juego(self):
                    pilas.escenas.EscenaJuegol()
                def Historia_del_juego(self):
                    pilas.escenas.HistoriaJuego()

class EscenaJuego(pilasengine.escenas.Escena):
                def iniciar(self):
                        pilas.escenas.Normal()
                        fondo = pilas.fondos.Fondo("/home/jemf/Escritorio/juego/fondos/conjuro.png")
                        self.lista_enemigos = []
                        self.cantidad_de_enemigos = 0

                        self._crear_barras_de_energia()
                        self.stickman =Stickman(self.lista_enemigos, self)

                        self._crear_eventos_personalizados()
                        self._crear_escenario()
                def _crear_eventos_personalizados(self):
                        pilas.eventos.se_golpea_a_enemigo = pilas.evento.Evento("se_golpea_enemigo")
                        pilas.eventos.se_golpea_a_enemigo.conectar(self.actualizar_energia_enemigo)

                        pilas.eventos.se_golpea_a_stickman = pilas.evento.Evento("se_golpea_a_stickman")
                        pilas.eventos.se_golpea_a_stickman.conectar(self.actualizar_energia_stickman)

                        pilas.eventos.se_muere_un_enemigo = pilas.evento.Evento("se_muere_un_enemigo")
                        pilas.eventos.se_muere_un_enemigo.conectar(self._cuando_muere_un_enemigo)

                        pilas.eventos.se_muere_el_stickman = pilas.evento.Evento("se_muere_el_stickman")
                        pilas.eventos.se_muere_el_stickman.conectar(self._cuando_muere_el_stickman)
                def _crear_escenario(self):
                        escenario.Escenario(self)
                def crear_enemigo(self, clase, x, y):
                        self.lista_enemigos.append(clase(self.stickman, x=x, y=y))
                        self.cantidad_de_enemigos += 1
                def _cuando_muere_un_enemigo(self, evento):
                        #actor_que_muere = evento.actor
                        self.cantidad_de_enemigos -= 1
                def _cuando_muere_el_stickman(self, evento):
                        #referencia_al_shaolin_que_muere = evento.actor
                        self._crear_texto_game_over()
                        pilas,eventos.pulsa_tecla_escape.conectar(self._reiniciar_el_nivel)
                def _reiniciar_el_nivel(self, evento):
                        EscenaJuego()
                def _crear_texto_game_over(self):
                        titulo = "Game Over"
                        subtitulo = "Pulse escape para reiniciar"
                        self._crear_mensaje_de_texto(subtitulo, titulo)
                def _crear_mensaje_de_texto(self, subtitulo, titulo):
                        texto_titulo = pilas.actores.Texto(titulo, magnitud=40)
                        texto_titulo.z = -1000
                        texto_titulo.escala = 0.1
                        texto_titulo.escala = [1], 0.5

                        texto_subtitulo = pilas.actores.Texto(subtitulo)
                        texto_subtitulo.y = -60
                        texto_subtitulo.transparencia = 100
                        texto_subtitulo.transparencia = [0]
                        texto_subtitulo.z = -1000
                def _crear_barras_de_energia(self):
                        self.energia_stickman = pilas.actores.Energia(x=-280, y=213, alto=20)
                        self.energia_enemigo = pilas.actores.Energia(x=+315, y=213, alto=20)
                def actualizar_energia_enemigo(self, evento):
                        self.energia_enemigo.progreso = evento.quien.energia
                def actualizar_energia_stickman(self, evento):
                        self.energia_stickman.progreso = evento.quien.energia
                def Volver(self):
                        pilas.escenas.EscenaMenu()
                def actualizar(self):
                        pass
                pilas.actores.Actor.vincular(Stickman)

                jugador = pilas.actores.Actor.Stickman(y = -100 , x = 200 , imagen = "/home/jemf/Escritorio/juego/sprites/stickman/stickman.png" )
                pilas.jugador.escala = 0.5
                teclas = {
                            pilas.simbolos.a: 'izquierda',
                            pilas.simbolos.d: 'derecha' ,
                            pilas.simbolos.w: 'arriba' ,
                            pilas.simbolos.g: 'boton' ,
                            pilas.simbolos.h: 'boton2'}
                mi_control = pilas.control.Control(teclas)

class HistoriaJuego(pilasengine.escenas.Escena):
                def iniciar(self):

                    self.musicainter = self.pilas.musica.cargar("musica_fondo/Chaos Chaos - Do You Feel It (RICK AND MORTY).mp3")
                    self.musicainter.reproducir()

                    fondo = pilas.fondos.Fondo()
                    fondo.imagen = pilas.imagenes.cargar("/home/jemf/Escritorio/juego/fondos/negro.jpg")

                    self.Expli = self.pilas.actores.Texto[
                        u'el es el hijo de un casador de demonios y busca venganza de parte de su padre',
                        u'ya que satanas se lo ah llevado a las profundidades del infierno',
                        u'ahora el esta combatiendo con un ejercito demoniaco galactico espacial']

                    self.Expli.y = -500
                    self.Expli.x = 0
                    self.pilas.tareas.agregar(3, self.bajar_texto)
                    self.pilas.tareas.agregar(42, self.crear_menu)

                def bajar_texto(self):
                    self.pilas.utils.interpolar(self.Expli, 'y', 500, duracion=40, tipo='lineal')

                def crear_menu(self):
                    self.MiMenu6 =self.pilas.actores.Menu()
                    [
                        (u'Volver a menu...', self.volver_a_ver),
                    ]

class Stickman(pilasengine.actores.Actor):

        def iniciar(self, x=0, y=0, imagen=None, imagen2=None, control=None):
            self.x = x
            self.y = y
            if control:
                self.control = control
            else:
                self.control = self.pilas.control
            if imagen:
                self.path_img = imagen
            elif imagen:
                self.imagen ="/home/jemf/Escritorio/juego/sprites/stickman/stickman.png"
            if imagen2:
                self.path_img2 = imagen2
            elif imagen2:
                self.path_img2 = "/home/jemf/Escritorio/juego/sprites/stickman/corre.png"
            self.hacer_inmediatamente(Parado)
            self.altura_del_salto = 0
    #def cuando_pulsa_una_tecla(self, evento):
        #elif evento.codigo == pilas.simbolos.d:
            #self.comportamiento_actual.pulsa_golpear()
class Parado(Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.control
        self.receptor.imagen = self.pilas.imagenes.cargar_grilla(self.receptor.path_img)
        self.receptor.centro = ("centro", "abajo")

    def actualizar(self):
        self.receptor.imagen.avanzar(10)

        if self.control.derecha or self.control.izquierda:
            self.receptor.hacer_inmediatamente(Caminar)
        if self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)
        if self.control.boton:
            self.receptor.hacer_inmediatamente(Pegar)
        if self.control.boton2:
            self.receptor.hacer_inmediatamente(Patada)
class Caminar(Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.control

        self.receptor.imagen = self.pilas.imagenes.cargar_grilla(self.receptor.path_img2, 4, 1)
        self.receptor.centro = ("centro", "abajo")

    def actualizar(self):
        self.receptor.imagen.avanzar(10)

        # Si pulsa a los costados se puede mover.
        if self.control.derecha:
            self.receptor.x += 5
            self.receptor.espejado = False
        elif self.control.izquierda:
            self.receptor.x -= 5
            self.receptor.espejado = True

        # Si pulsa hacia arriba salta.
        if self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)
        if self.control.boton:
            self.receptor.hacer_inmediatamente(Pegar)
        if self.control.boton2:
            self.receptor.hacer_inmediatamente(Pegar)
        # Si suelta las teclas regresa al estado inicial.
        if not self.control.derecha and not self.control.izquierda:
            self.receptor.hacer_inmediatamente(Parado)
class Saltar(Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/salto.png", 3, 1)
        self.receptor.centro = ("centro", "abajo")
        self.y_inicial = self.receptor.y
        self.vy = 15

    def actualizar(self):
        self.receptor.y += self.vy
        self.vy -= 0.7

        distancia_al_suelo = self.receptor.y - self.y_inicial
        self.receptor.altura_del_salto = distancia_al_suelo

        # Cuando llega al suelo, regresa al estado inicial.
        if distancia_al_suelo < 0:
            self.receptor.y = self.y_inicial
            self.receptor.altura_del_salto = 0
            self.receptor.hacer_inmediatamente(Parado)

        # Si pulsa a los costados se puede mover.
        if self.control.derecha:
            self.receptor.x += 5
            self.receptor.espejado = False
        elif self.control.izquierda:
            self.receptor.x -= 5
            self.receptor.espejado = True
class Golpear (Comportamiento):
    ha_golpeado = False
    numero_de_ataque = 0
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        if evento.codigo == pilas.simbolos.boton:
            self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/puno.png", 3, 1)
            self.receptor.centro = ("centro", "abajo")

        def actualizar(self):
            if self.receptor.avanzar_animacion(0.4):
                self.receptor.hacer(Parado())
                self.eliminar_golpe()
            else:
                if self.golpe:
                    enemigo = self.golpe.verificar_colisiones()
                if enemigo:
                    self.eliminar_golpe()

                    ataque_fuerte = (self.numero_de_ataque == 4)
                    enemigo.ha_sido_golpeado(self.shaolin, fuerte=ataque_fuerte)
                    Golpear.ha_golpeado = True
                else:
                    Golpear.ha_golpeado =False
    def ha_sido_golpeado(self, otro_actor, fuerte):
        self._pasa_a_estado_golpeado()
    def __init__(self, actor, enemigos, dx, dy):
        pilas.actores.Actor.__init__(self)
        self.actor = actor
        self.dx = dx
        self.dy = dy
        self.enemigos = enemigos
        self.actualizar()

    def actualizar(self):
        if self.actor.espejado:
            self.x = self.actor.x - 70 - self.dx
        else:
            self.x = self.actor.x + 70 + self.dx

        self.y = self.actor.y + self.actor.altura_del_salto + self.dy

    def verificar_colisiones(self):
        for enemigo in self.enemigos:

            area = [
                    enemigo.izquierda + 10,
                    enemigo.derecha - 10,
                    enemigo.abajo,
                    enemigo.arriba,
                   ]

            if enemigo.puede_ser_golpeado:
                if area[0] < self.x < area[1] and area[2] < self.y < area[3]:
                    if abs(enemigo.y - self.actor.y) < 15:
                        if enemigo.altura_del_salto < 80:
                            self.crear_efecto_de_golpe()
                            return enemigo

    def crear_efecto_de_golpe(self):
        dx = random.randint(-10, 10)
        dy = random.randint(-10, 10)
        efecto_golpe.EfectoGolpe(self.x + dx, self.y + dy)
class Patada (Comportamiento):
    ha_golpeado = False
    numero_de_ataque = 0
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        if evento.codigo == pilas.simbolos.boton2:
            self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/patada.png", 3, 1)
            self.receptor.centro = ("centro", "abajo")

        def actualizar(self):
            if self.receptor.avanzar_animacion(0.4):
                self.receptor.hacer(Parado())
                self.eliminar_golpe()
            else:
                if self.golpe:
                    enemigo = self.golpe.verificar_colisiones()
                if enemigo:
                    self.eliminar_golpe()

                    ataque_fuerte = (self.numero_de_ataque == 4)
                    enemigo.ha_sido_golpeado(self.shaolin, fuerte=ataque_fuerte)
                    Golpear.ha_golpeado = True
                else:
                    Golpear.ha_golpeado =False
    def ha_sido_golpeado(self, otro_actor, fuerte):
        self._pasa_a_estado_golpeado()
    def __init__(self, actor, enemigos, dx, dy):
        pilas.actores.Actor.__init__(self)
        self.actor = actor
        self.dx = dx
        self.dy = dy
        self.enemigos = enemigos
        self.actualizar()

    def actualizar(self):
        if self.actor.espejado:
            self.x = self.actor.x - 70 - self.dx
        else:
            self.x = self.actor.x + 70 + self.dx

        self.y = self.actor.y + self.actor.altura_del_salto + self.dy

    def verificar_colisiones(self):
        for enemigo in self.enemigos:

            area = [
                    enemigo.izquierda + 10,
                    enemigo.derecha - 10,
                    enemigo.abajo,
                    enemigo.arriba,
                   ]

            if enemigo.puede_ser_golpeado:
                if area[0] < self.x < area[1] and area[2] < self.y < area[3]:
                    if abs(enemigo.y - self.actor.y) < 15:
                        if enemigo.altura_del_salto < 80:
                            self.crear_efecto_de_golpe()
                            return enemigo

    def dibujar(self, aplicacion):
        if DEPURACION:
            pilas.actores.Actor.dibujar(self, aplicacion)

    def crear_efecto_de_golpe(self):
        dx = random.randint(-10, 10)
        dy = random.randint(-10, 10)
        efecto_golpe.EfectoGolpe(self.x + dx, self.y + dy)

class Enemigos(pilasengine.actores.Actor):
            def __init__(self, Stickman, x, y):
                enemigo.Enemigo.__init__(self)
                self.Stickman = Stickman
                self._cargar_animaciones()
                self.z = 0
                self.centro = ("centro", "abajo")
                self.x = x
                self.y = y
                self.altura_del_salto = 0
                self.actualizar()

                self._iniciar()
                self.pasar_al_siguiente_estado_ai()
                self.mover(0, 0)
                self.energia = 100

            def reducir_energia(self, cantidad):
                self.energia -= cantidad
                pilas.eventos.se_golpea_a_enemigo.emitir(quien=self)

            def _iniciar(self):
                self.comportamientos_ai = [
                estados.Parado(segundos=1),
                estados.CaminarAleatoriamente(segundos=0.5),
                estados.Golpear(),
                estados.Parado(segundos=1),
                estados.CaminaHaciaLineaVerticalDelStickman(segundos=1),
                    ]
                self.comportamiento_ai_indice = 0

                self.hacer(estados.IngresarCayendo())
                self.miniatura = pilas.imagenes.cargar("red/mini.png")

            def actualizar(self):
                enemigo.Enemigo.actualizar(self)
                if self.avanzar_animacion(0.15):
                    self.comportamiento_actual.ha_terminado_animacion()

            def pasar_al_siguiente_estado_ai(self):

                self.comportamiento_ai_indice += 1
                self.comportamiento_ai_indice %= len(self.comportamientos_ai)

                estado_nuevo = self.comportamientos_ai[self.comportamiento_ai_indice]
                self.hacer(estado_nuevo)

            def cargar_primer_estado_ai(self):
                self.comportamiento_ai_indice = -1
                self.pasar_al_siguiente_estado_ai()

            def _cargar_animaciones(self):
                cargar = pilas.imagenes.cargar_grilla
                self.animaciones = {
                    'parado': cargar("/home/jemf/Escritorio/juego/sprites/enemigo.png", 1),
                    'golpear': cargar("/home/jemf/Escritorio/juego/sprites/enemigos/puno.png", 3),
                    'patada' : cargar("/home/jemf/Escritorio/juego/sprites/enemigos/patada.png", 3),
                    'caminar': cargar("/home/jemf/Escritorio/juego/sprites/enemigos/corre.png", 4),
                    'saltando': cargar("/home/jemf/Escritorio/juego/sprites/enemigos/salto.png", 1),
                        }

            def mirar_al_stickman(self):
                self.espejado = self.stickman.x < self.x
class Parado(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('parado')
        self.enemigo.mirar_al_stickman()

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.mirar_al_stickman()
class CaminarAleatoriamente(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('caminar')

        self.dx = random.choice([1, -1])
        self.dy = random.choice([1, 0, -1])

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.mover(self.dx, self.dy)
        self.enemigo.mirar_al_stic()
class Golpear(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('golpear')
        self.golpear(dx=30)

    def actualizar(self):
        Comportamiento.actualizar(self)

        if self.golpe:
            stickman_que_ha_golpeado = self.golpe.verificar_colisiones()

            if stickman_que_ha_golpeado:
                stickman_que_ha_golpeado.ha_sido_golpeado(self, False)
                self.eliminar_golpe()

    def ha_terminado_animacion(self):
        self.eliminar_golpe()
        self.enemigo.pasar_al_siguiente_estado_ai()
class LoGolpean(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('lo_golpean')
        self.x_inicial = self.enemigo.x
        self.y_inicial = self.enemigo.y
        self.contador = 20

        enemigo.reducir_energia(15)

    def actualizar(self):
        x = self.x_inicial
        y = self.y_inicial

        self.enemigo.x = random.choice([x - 1, x, x + 1])
        self.enemigo.y = random.choice([y - 1, y, y + 1])

        if self.contador < 0:
            self.enemigo.x = self.x_inicial
            self.enemigo.y = self.y_inicial
            self.enemigo.cargar_primer_estado_ai()
        else:
            self.contador -= 1

    def ha_sido_golpeado(self, otro_actor, fuerte=False):
        pass
class CaminaHaciaLineaVerticalDelStickman(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('caminar')
        self._seleccionar_dy()
        self._salir_si_esta_cerca_verticalmente()

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.mover(0, self.dy)
        self.enemigo.mirar_al_stickman()
        self._salir_si_esta_cerca_verticalmente()

    def _distancia_vertical_al_shaolin(self):
        return abs(self.enemigo.stickman.y - self.enemigo.y)

    def _salir_si_esta_cerca_verticalmente(self):
        if self._distancia_vertical_al_stickman() < 10:
            self.enemigo.pasar_al_siguiente_estado_ai()

    def _seleccionar_dy(self):
        if self.enemigo.stickman.y < self.enemigo.y:
            self.dy = -1
        else:
            self.dy = 1
class Morirse(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.definir_cuadro(1)
        self.enemigo.puede_ser_golpeado = False
        pilas.eventos.se_muere_un_enemigo.emitir(actor=self)

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.definir_cuadro(1)

        self.enemigo.transparencia += 1
        self.enemigo.sombra.transparencia += 1

        if self.enemigo.transparencia > 100:
            self.eliminar_actor_del_escenario()

    def eliminar_actor_del_escenario(self):
        self.enemigo.sombra.eliminar()
        self.enemigo.eliminar()

pilas.escenas.vincular(EscenaMenu)
pilas.escenas.vincular(EscenaJuego)
pilas.escenas.vincular(HistoriaJuego)
pilas.escenas.EscenaJuego()
pilas.escenas.HistoriaJuego()

pilas.actores.vincular(Stickman)
pilas.ectores.vincular(Enemigos)

pilas.ejecutar()

pd: muchas gracias con ayudarme con esto, me ayudan bastante :sweat:

pd2: me pueden decir porque me aparece el error antes de miércoles es que ese día tengo que entregar el juego Dx

Hola @jemf !!!

Arreglé la mayoría de los problemas que encontré, tuve que poner “#” al principio de varias lineas porque no tenía las imágenes del juego, mirá el código y eliminá esos “#” según corresponda:

El código tiene muchos detalles para corregir, pero son muchísimos… no puedo verlos todos, igualmente los arreglos que hice te van a servir. Avisanos cualquier cosa.

# coding: utf-8
import pilasengine
from pilasengine.actores.actor import Actor
from pilasengine.comportamientos.comportamiento import Comportamiento
import random


pilas = pilasengine.iniciar(ancho = 1280, alto = 700)


class EscenaMenu(pilasengine.escenas.Escena):

    def iniciar(self):
        fondo = pilas.fondos.Fondo()
        #fondo.imagen = pilas.imagenes.cargar("/home/jemf/Escritorio/Proyecto Juego/fondos/fondo2.jpg")
        fondo.imagen = pilas.imagenes.cargar("mono.png")

        self.Mi_Menu = pilas.actores.Menu(
           [
                 (u'IR  AL JUEGO', self.Ir_al_juego),
                 (u'HISTORIA DEL JUEGO' , self.Historia_del_juego),
                 (u'SALIR DE PILAS', self.Salir_de_Pilas)
           ])
        ##############################################

        Nombre_de_mi_juego = pilas.actores.Texto(u'VENGANZA')
        Nombre_de_mi_juego.color = pilas.colores.blanco
        Nombre_de_mi_juego.y = 170

    def Salir_de_Pilas(self):
        pilas.terminar()

    def Ir_al_juego(self):
        pilas.escenas.EscenaJuego()

    def Historia_del_juego(self):
        pilas.escenas.HistoriaJuego()

class EscenaJuego(pilasengine.escenas.Escena):

    def iniciar(self):
        pilas.escenas.Normal()
        #fondo = pilas.fondos.Fondo("/home/jemf/Escritorio/juego/fondos/conjuro.png")
        fondo = pilas.fondos.Fondo()
        self.lista_enemigos = []
        self.cantidad_de_enemigos = 0

        self._crear_barras_de_energia()
        #self.stickman = self.pilas.actores.Stickman(self.lista_enemigos, self)

        #self.stickman = pilas.actores.Stickman(y = -100 , x = 200 , imagen = "/home/jemf/Escritorio/juego/sprites/stickman/stickman.png" )
        self.stickman = pilas.actores.Stickman(y = -100 , x = 200 , imagen="aceituna.png")
        self.stickman.escala = 0.5
        teclas = {
                    pilas.simbolos.a: 'izquierda',
                    pilas.simbolos.d: 'derecha' ,
                    pilas.simbolos.w: 'arriba' ,
                    pilas.simbolos.g: 'boton' ,
                    pilas.simbolos.h: 'boton2'}

        mi_control = pilas.control.Control(teclas)

        self._crear_eventos_personalizados()
        self._crear_escenario()

    def _crear_eventos_personalizados(self):
        pilas.eventos.se_golpea_a_enemigo = pilas.evento.Evento("se_golpea_enemigo")
        pilas.eventos.se_golpea_a_enemigo.conectar(self.actualizar_energia_enemigo)

        pilas.eventos.se_golpea_a_stickman = pilas.evento.Evento("se_golpea_a_stickman")
        pilas.eventos.se_golpea_a_stickman.conectar(self.actualizar_energia_stickman)

        pilas.eventos.se_muere_un_enemigo = pilas.evento.Evento("se_muere_un_enemigo")
        pilas.eventos.se_muere_un_enemigo.conectar(self._cuando_muere_un_enemigo)

        pilas.eventos.se_muere_el_stickman = pilas.evento.Evento("se_muere_el_stickman")
        pilas.eventos.se_muere_el_stickman.conectar(self._cuando_muere_el_stickman)

    def _crear_escenario(self):
        #escenario.Escenario(self)
        pass

    def crear_enemigo(self, clase, x, y):
        self.lista_enemigos.append(clase(self.stickman, x=x, y=y))
        self.cantidad_de_enemigos += 1

    def _cuando_muere_un_enemigo(self, evento):
        #actor_que_muere = evento.actor
        self.cantidad_de_enemigos -= 1

    def _cuando_muere_el_stickman(self, evento):
        #referencia_al_shaolin_que_muere = evento.actor
        self._crear_texto_game_over()
        pilas,eventos.pulsa_tecla_escape.conectar(self._reiniciar_el_nivel)

    def _reiniciar_el_nivel(self, evento):
        self.pilas.escenas.EscenaJuego()

    def _crear_texto_game_over(self):
        titulo = "Game Over"
        subtitulo = "Pulse escape para reiniciar"
        self._crear_mensaje_de_texto(subtitulo, titulo)

    def _crear_mensaje_de_texto(self, subtitulo, titulo):
        texto_titulo = pilas.actores.Texto(titulo, magnitud=40)
        texto_titulo.z = -1000
        texto_titulo.escala = 0.1
        texto_titulo.escala = [1], 0.5

        texto_subtitulo = pilas.actores.Texto(subtitulo)
        texto_subtitulo.y = -60
        texto_subtitulo.transparencia = 100
        texto_subtitulo.transparencia = [0]
        texto_subtitulo.z = -1000

    def _crear_barras_de_energia(self):
        self.energia_stickman = pilas.actores.Energia(x=-280, y=213, alto=20)
        self.energia_enemigo = pilas.actores.Energia(x=+315, y=213, alto=20)

    def actualizar_energia_enemigo(self, evento):
        self.energia_enemigo.progreso = evento.quien.energia

    def actualizar_energia_stickman(self, evento):
        self.energia_stickman.progreso = evento.quien.energia

    def Volver(self):
        pilas.escenas.EscenaMenu()

    def actualizar(self):
        pass


class HistoriaJuego(pilasengine.escenas.Escena):

    def iniciar(self):

        #self.musicainter = self.pilas.musica.cargar("musica_fondo/Chaos Chaos - Do You Feel It (RICK AND MORTY).mp3")
        #self.musicainter.reproducir()
        #fondo = pilas.fondos.Fondo()
        #fondo.imagen = pilas.imagenes.cargar("/home/jemf/Escritorio/juego/fondos/negro.jpg")

        self.Expli = self.pilas.actores.Texto("""
            el es el hijo de un casador de demonios y busca venganza de parte de su padre\n
            ya que satanas se lo ah llevado a las profundidades del infierno\n
            ahora el esta combatiendo con un ejercito demoniaco galactico espacial\n
        """)
        self.Expli.y = -450
        self.Expli.x = 0
        self.bajar_texto()
        self.pilas.tareas.agregar(5, self.crear_menu)

    def bajar_texto(self):
        self.pilas.utils.interpolar(self.Expli, 'y', 500, duracion=40, tipo='lineal')

    def crear_menu(self):
        self.MiMenu6 = self.pilas.actores.Menu([
            (u'Volver a menu...', self.volver_a_ver),
            ])

    def volver_a_ver(self):
        self.pilas.escenas.EscenaMenu()

class Stickman(pilasengine.actores.Actor):

    def iniciar(self, x=0, y=0, imagen=None, imagen2=None, control=None):
        self.x = x
        self.y = y
        if control:
            self.control = control
        else:
            self.control = self.pilas.control
        if imagen:
            self.path_img = imagen
        elif imagen:
            self.imagen ="/home/jemf/Escritorio/juego/sprites/stickman/stickman.png"
        if imagen2:
            self.path_img2 = imagen2
        elif imagen2:
            self.path_img2 = "/home/jemf/Escritorio/juego/sprites/stickman/corre.png"
        self.hacer_inmediatamente(Parado)
        self.altura_del_salto = 0

    #def cuando_pulsa_una_tecla(self, evento):
    #elif evento.codigo == pilas.simbolos.d:
        #self.comportamiento_actual.pulsa_golpear()

class Parado(Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.control
        self.receptor.imagen = self.pilas.imagenes.cargar_grilla(self.receptor.path_img)
        self.receptor.centro = ("centro", "abajo")

    def actualizar(self):
        self.receptor.imagen.avanzar(10)

        if self.control.derecha or self.control.izquierda:
            self.receptor.hacer_inmediatamente(Caminar)
        if self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)
        if self.control.boton:
            self.receptor.hacer_inmediatamente(Pegar)
        if self.control.boton2:
            self.receptor.hacer_inmediatamente(Patada)

class Caminar(Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.control

        self.receptor.imagen = self.pilas.imagenes.cargar_grilla(self.receptor.path_img2, 4, 1)
        self.receptor.centro = ("centro", "abajo")

    def actualizar(self):
        self.receptor.imagen.avanzar(10)

        # Si pulsa a los costados se puede mover.
        if self.control.derecha:
            self.receptor.x += 5
            self.receptor.espejado = False
        elif self.control.izquierda:
            self.receptor.x -= 5
            self.receptor.espejado = True

        # Si pulsa hacia arriba salta.
        if self.control.arriba:
            self.receptor.hacer_inmediatamente(Saltar)
        if self.control.boton:
            self.receptor.hacer_inmediatamente(Pegar)
        if self.control.boton2:
            self.receptor.hacer_inmediatamente(Pegar)
        # Si suelta las teclas regresa al estado inicial.
        if not self.control.derecha and not self.control.izquierda:
            self.receptor.hacer_inmediatamente(Parado)

class Saltar(Comportamiento):

    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/salto.png", 3, 1)
        self.receptor.centro = ("centro", "abajo")
        self.y_inicial = self.receptor.y
        self.vy = 15

    def actualizar(self):
        self.receptor.y += self.vy
        self.vy -= 0.7

        distancia_al_suelo = self.receptor.y - self.y_inicial
        self.receptor.altura_del_salto = distancia_al_suelo

        # Cuando llega al suelo, regresa al estado inicial.
        if distancia_al_suelo < 0:
            self.receptor.y = self.y_inicial
            self.receptor.altura_del_salto = 0
            self.receptor.hacer_inmediatamente(Parado)

        # Si pulsa a los costados se puede mover.
        if self.control.derecha:
            self.receptor.x += 5
            self.receptor.espejado = False
        elif self.control.izquierda:
            self.receptor.x -= 5
            self.receptor.espejado = True

class Golpear (Comportamiento):
    ha_golpeado = False
    numero_de_ataque = 0
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        if evento.codigo == pilas.simbolos.boton:
            self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/puno.png", 3, 1)
            self.receptor.centro = ("centro", "abajo")

        def actualizar(self):
            if self.receptor.avanzar_animacion(0.4):
                self.receptor.hacer(Parado())
                self.eliminar_golpe()
            else:
                if self.golpe:
                    enemigo = self.golpe.verificar_colisiones()
                if enemigo:
                    self.eliminar_golpe()

                    ataque_fuerte = (self.numero_de_ataque == 4)
                    enemigo.ha_sido_golpeado(self.shaolin, fuerte=ataque_fuerte)
                    Golpear.ha_golpeado = True
                else:
                    Golpear.ha_golpeado =False

    def ha_sido_golpeado(self, otro_actor, fuerte):
        self._pasa_a_estado_golpeado()

    def __init__(self, actor, enemigos, dx, dy):
        pilas.actores.Actor.__init__(self)
        self.actor = actor
        self.dx = dx
        self.dy = dy
        self.enemigos = enemigos
        self.actualizar()

    def actualizar(self):
        if self.actor.espejado:
            self.x = self.actor.x - 70 - self.dx
        else:
            self.x = self.actor.x + 70 + self.dx

        self.y = self.actor.y + self.actor.altura_del_salto + self.dy

    def verificar_colisiones(self):
        for enemigo in self.enemigos:

            area = [
                    enemigo.izquierda + 10,
                    enemigo.derecha - 10,
                    enemigo.abajo,
                    enemigo.arriba,
                   ]

            if enemigo.puede_ser_golpeado:
                if area[0] < self.x < area[1] and area[2] < self.y < area[3]:
                    if abs(enemigo.y - self.actor.y) < 15:
                        if enemigo.altura_del_salto < 80:
                            self.crear_efecto_de_golpe()
                            return enemigo

    def crear_efecto_de_golpe(self):
        dx = random.randint(-10, 10)
        dy = random.randint(-10, 10)
        efecto_golpe.EfectoGolpe(self.x + dx, self.y + dy)

class Patada (Comportamiento):
    ha_golpeado = False
    numero_de_ataque = 0
    def iniciar(self, receptor):
        self.receptor = receptor
        self.control = receptor.pilas.control

        if evento.codigo == pilas.simbolos.boton2:
            self.receptor.imagen = self.pilas.imagenes.cargar_grilla("/home/jemf/Escritorio/Proyecto Juego/sprites/stickman/patada.png", 3, 1)
            self.receptor.centro = ("centro", "abajo")

        def actualizar(self):
            if self.receptor.avanzar_animacion(0.4):
                self.receptor.hacer(Parado())
                self.eliminar_golpe()
            else:
                if self.golpe:
                    enemigo = self.golpe.verificar_colisiones()
                if enemigo:
                    self.eliminar_golpe()

                    ataque_fuerte = (self.numero_de_ataque == 4)
                    enemigo.ha_sido_golpeado(self.shaolin, fuerte=ataque_fuerte)
                    Golpear.ha_golpeado = True
                else:
                    Golpear.ha_golpeado =False

    def ha_sido_golpeado(self, otro_actor, fuerte):
        self._pasa_a_estado_golpeado()

    def __init__(self, actor, enemigos, dx, dy):
        pilas.actores.Actor.__init__(self)
        self.actor = actor
        self.dx = dx
        self.dy = dy
        self.enemigos = enemigos
        self.actualizar()

    def actualizar(self):
        if self.actor.espejado:
            self.x = self.actor.x - 70 - self.dx
        else:
            self.x = self.actor.x + 70 + self.dx

        self.y = self.actor.y + self.actor.altura_del_salto + self.dy

    def verificar_colisiones(self):
        for enemigo in self.enemigos:

            area = [
                    enemigo.izquierda + 10,
                    enemigo.derecha - 10,
                    enemigo.abajo,
                    enemigo.arriba,
                   ]

            if enemigo.puede_ser_golpeado:
                if area[0] < self.x < area[1] and area[2] < self.y < area[3]:
                    if abs(enemigo.y - self.actor.y) < 15:
                        if enemigo.altura_del_salto < 80:
                            self.crear_efecto_de_golpe()
                            return enemigo

    def dibujar(self, aplicacion):
        if DEPURACION:
            pilas.actores.Actor.dibujar(self, aplicacion)

    def crear_efecto_de_golpe(self):
        dx = random.randint(-10, 10)
        dy = random.randint(-10, 10)
        efecto_golpe.EfectoGolpe(self.x + dx, self.y + dy)

class Enemigos(pilasengine.actores.Actor):
    def __init__(self, Stickman, x, y):
        enemigo.Enemigo.__init__(self)
        self.Stickman = Stickman
        self._cargar_animaciones()
        self.z = 0
        self.centro = ("centro", "abajo")
        self.x = x
        self.y = y
        self.altura_del_salto = 0
        self.actualizar()

        self._iniciar()
        self.pasar_al_siguiente_estado_ai()
        self.mover(0, 0)
        self.energia = 100

    def reducir_energia(self, cantidad):
        self.energia -= cantidad
        pilas.eventos.se_golpea_a_enemigo.emitir(quien=self)

    def _iniciar(self):
        self.comportamientos_ai = [
        estados.Parado(segundos=1),
        estados.CaminarAleatoriamente(segundos=0.5),
        estados.Golpear(),
        estados.Parado(segundos=1),
        estados.CaminaHaciaLineaVerticalDelStickman(segundos=1),
            ]
        self.comportamiento_ai_indice = 0

        self.hacer(estados.IngresarCayendo())
        self.miniatura = pilas.imagenes.cargar("red/mini.png")

    def actualizar(self):
        enemigo.Enemigo.actualizar(self)
        if self.avanzar_animacion(0.15):
            self.comportamiento_actual.ha_terminado_animacion()

    def pasar_al_siguiente_estado_ai(self):

        self.comportamiento_ai_indice += 1
        self.comportamiento_ai_indice %= len(self.comportamientos_ai)

        estado_nuevo = self.comportamientos_ai[self.comportamiento_ai_indice]
        self.hacer(estado_nuevo)

    def cargar_primer_estado_ai(self):
        self.comportamiento_ai_indice = -1
        self.pasar_al_siguiente_estado_ai()

    def _cargar_animaciones(self):
        cargar = pilas.imagenes.cargar_grilla
        self.animaciones = {
            'parado': cargar("/home/jemf/Escritorio/juego/sprites/enemigo.png", 1),
            'golpear': cargar("/home/jemf/Escritorio/juego/sprites/enemigos/puno.png", 3),
            'patada' : cargar("/home/jemf/Escritorio/juego/sprites/enemigos/patada.png", 3),
            'caminar': cargar("/home/jemf/Escritorio/juego/sprites/enemigos/corre.png", 4),
            'saltando': cargar("/home/jemf/Escritorio/juego/sprites/enemigos/salto.png", 1),
                }

    def mirar_al_stickman(self):
        self.espejado = self.stickman.x < self.x

class Parado(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('parado')
        self.enemigo.mirar_al_stickman()

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.mirar_al_stickman()

class CaminarAleatoriamente(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('caminar')

        self.dx = random.choice([1, -1])
        self.dy = random.choice([1, 0, -1])

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.mover(self.dx, self.dy)
        self.enemigo.mirar_al_stic()

class Golpear(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('golpear')
        self.golpear(dx=30)

    def actualizar(self):
        Comportamiento.actualizar(self)

        if self.golpe:
            stickman_que_ha_golpeado = self.golpe.verificar_colisiones()

            if stickman_que_ha_golpeado:
                stickman_que_ha_golpeado.ha_sido_golpeado(self, False)
                self.eliminar_golpe()

    def ha_terminado_animacion(self):
        self.eliminar_golpe()
        self.enemigo.pasar_al_siguiente_estado_ai()

class LoGolpean(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('lo_golpean')
        self.x_inicial = self.enemigo.x
        self.y_inicial = self.enemigo.y
        self.contador = 20

        enemigo.reducir_energia(15)

    def actualizar(self):
        x = self.x_inicial
        y = self.y_inicial

        self.enemigo.x = random.choice([x - 1, x, x + 1])
        self.enemigo.y = random.choice([y - 1, y, y + 1])

        if self.contador < 0:
            self.enemigo.x = self.x_inicial
            self.enemigo.y = self.y_inicial
            self.enemigo.cargar_primer_estado_ai()
        else:
            self.contador -= 1

    def ha_sido_golpeado(self, otro_actor, fuerte=False):
        pass

class CaminaHaciaLineaVerticalDelStickman(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.cambiar_animacion('caminar')
        self._seleccionar_dy()
        self._salir_si_esta_cerca_verticalmente()

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.mover(0, self.dy)
        self.enemigo.mirar_al_stickman()
        self._salir_si_esta_cerca_verticalmente()

    def _distancia_vertical_al_shaolin(self):
        return abs(self.enemigo.stickman.y - self.enemigo.y)

    def _salir_si_esta_cerca_verticalmente(self):
        if self._distancia_vertical_al_stickman() < 10:
            self.enemigo.pasar_al_siguiente_estado_ai()

    def _seleccionar_dy(self):
        if self.enemigo.stickman.y < self.enemigo.y:
            self.dy = -1
        else:
            self.dy = 1

class Morirse(Comportamiento):

    def iniciar(self, enemigo):
        Comportamiento.iniciar(self, enemigo)
        self.enemigo.definir_cuadro(1)
        self.enemigo.puede_ser_golpeado = False
        pilas.eventos.se_muere_un_enemigo.emitir(actor=self)

    def actualizar(self):
        Comportamiento.actualizar(self)
        self.enemigo.definir_cuadro(1)

        self.enemigo.transparencia += 1
        self.enemigo.sombra.transparencia += 1

        if self.enemigo.transparencia > 100:
            self.eliminar_actor_del_escenario()

    def eliminar_actor_del_escenario(self):
        self.enemigo.sombra.eliminar()
        self.enemigo.eliminar()

pilas.escenas.vincular(EscenaMenu)
pilas.escenas.EscenaMenu()

pilas.escenas.vincular(EscenaJuego)
pilas.escenas.vincular(HistoriaJuego)

pilas.actores.vincular(Stickman)
pilas.actores.vincular(Enemigos)

pilas.ejecutar()

hola,gracias me ayudaste mucho :smile: pero me a aparecido un error que no se que significa, por favor estuve un buen rato fijando me pero no lo logro resolver:

ERROR Exception(Exception(‘El parametro x tiene un valor no permitido: []’,),)
-630
Exception(Exception(‘El parametro x tiene un valor no permitido: []’,),)
Traceback (most recent call last):
File “/usr/local/lib/python2.7/dist-packages/pilas-1.4.10-py2.7.egg/pilasengine/widget.py”, line 25, in _decorator
func(self, *args, **kwargs)
File “/usr/local/lib/python2.7/dist-packages/pilas-1.4.10-py2.7.egg/pilasengine/widget.py”, line 166, in mousePressEvent
self.pilas.eventos.click_de_mouse.emitir(boton=event.button(), x=x, y=y)
File “/usr/local/lib/python2.7/dist-packages/pilas-1.4.10-py2.7.egg/pilasengine/eventos/evento.py”, line 30, in emitir
raise Exception(e)
Exception: El parametro x tiene un valor no permitido: []

Hola @jemf, ¿Estás siguiendo las instrucciones del manual para conectar el evento click al botón?

http://manual.pilas-engine.com.ar/interfaz/