Ayuda! tengo un problema con mi juego

tengo un problema a la hora de crear un juego y no se como solucionarlo…
funciona todo pero me salta un error cuando quiero entrar en la escena de juego.

> import pilasengine

> pilas = pilasengine.iniciar()

> MENSAJE_AYUDA = """
> En Space Atack, controlas una nave 
> utilizando el teclado.El objetivo del
> juego es disparar a los asteroides
> y ovnis evitando que golpeen tu nave.
> Para disparar debes que usar la
> barra espaciadora y para mover la 
> nave debes usar las flechas del teclado.
> """
> class Estado:
> 	def actualizar(self):
> 		pass
> class Jugando(Estado):
> 	def __init__(self,juego,nivel):
> 		self.nivel = nivel
> 		self.juego = juego
> 		self.juego.crear_piedras(cantidad=nivel*3)
> 		pilasengine.tareas.agregar(1,self.actualizar)
> 	def actualizar(self):
> 		if self.juego.ha_eliminado_todas_las_piedras():
> 			self.juego.cambiar_estado(Iniciando(self.juego,self.nivel+1))
> 			return False
> 		return True

> class Iniciando(Estado):
> 	def __init__(self,juego,nivel):
> 		self.texto = pilasengine.actores.Texto("Iniciando el nivel %d" %(nivel))
> 		self.nivel = nivel
> 		self.texto.color = pilasengine.colores.blanco
> 		self.contador_de_segundos = 0
> 		self.juego = juego
> 		pilasengine.tareas.agregar(1,self.actualizar)
> 	
> 	def actualizar(self):
> 		self.contador_de_segundos += 1
> 		if self.contador_de_segundos > 2:
> 			self.juego.cambiar_estado(Jugando(self.juego,self.nivel))
> 			self.texto.eliminar()
> 			return False
> 		return True
> 		
> class PierdeVida(Estado):
> 	def __init__(self,juego):
> 		self.contador_de_segundos = 0
> 		self.juego = juego
> 		if self.juego.contador_de_vidas.le_quedan_vidas():
> 			self.juego.contador_de_vidas.quitar_una_vida()
> 			pilasengine.tareas.agregar(1,self.actualizar)
> 		else:
> 			juego.cambiar_estado(PierdeTodoElJuego(juego))
> 	def actualizar(self):
> 		self.contador_de_segundos += 1
> 		if self.contador_de_segundos > 2:
> 			self.juego.crear_nave()
> 			return False
> 		return True
> 		
> class PierdeTodoElJuego(Estado):
> 	def __init__(self,juego):
> 		mensaje = pilasengine.actores.Texto("Lo siento, has perdido!")
> 		mensaje.color = pilasengine.colores.blanco
> 		mensaje.abajo = 240
> 		mensaje.abajo = [-20]
> 	def actualizar(self):
> 		pass

> class PiedraEspacial(pilasengine.actores.Piedra):
> 	"Represena una piedra espacial que se puede romper con un disparo."
> 	
> 	def __init__(self,piedras,x=0,y=0,tamano = "grande"):
> 		posibles_velocidades = range(-10,-2)+range(2,10)
> 		dx = random.choice(posibles_velocidades)/10.0
> 		dy = random.choice(posibles_velocidades)/10.0
> 		pilasengine.actores.Piedra.__init__(self,x=x,y=y,dx=dx,dy=dy,tamano=tamano)
> 		self.tamano = tamano
> 		self.piedras = piedras
> 	
> 	def eliminar(self):
> 		"Este metodo se invoca cuando el disparo colisiona con el objetivo."
> 		pilasengine.actores.Explosion(self.x,self.y)
> 		pilasengine.actores.Piedra.eliminar(self)
> 		if self.tamano == "grande":
> 			self.crear_dos_piedras_mas_pequenas(self.x,self.y,"media")
> 		elif self.tamano == "media":
> 			self.crear_dos_piedras_mas_pequenas(self.x,self.y,"chica")
> 	def crear_dos_piedras_mas_pequenas(self,x,y,tamano):
> 		"Genera dos piedras mas chicas, enemigas de la nave."
> 		piedra_1 = PiedraEspacial(self.piedras,x=x,y=y,tamano=tamano)
> 		piedra_2 = PiedraEspacial(self.piedras,x=x,y=y,tamano=tamano)
> 		self.piedras.append(piedra_1)
> 		self.piedras.append(piedra_2)

> class ContadorDeVidas:
> 	def __init__(self,cantidad_de_vidas):
> 		self.crear_texto()
> 		self.cantidad_de_vidas = cantidad_de_vidas
> 		self.vidas = [pilas.actores.Actor("data/vida.png")for x in range(cantidad_de_vidas)]
> 		for indice,vida in enumerate(self.vidas):
> 			vida.x = -230+indice*30
> 			vida.arriba = 230
> 	def crear_texto(self):
> 		"Genera el texto que dice 'vidas'"
> 		self.texto = pilasengine.actores.Texto("Vidas:")
> 		self.texto.color = pilasengine.colores.blanco
> 		self.texto.magnitud = 20
> 		self.texto.izquierda = -310
> 		self.texto.arriba = 220
> 	def le_quedan_vidas(self):
> 		self.cantidad_de_vidas -= 1
> 		vida = self.vidas.pop()
> 		vida.eliminar()

> class Enemigo(pilasengine.actores.Bomba):

> 	def iniciar(self):
> 		pilasengine.actores.Bomba.iniciar(self)
> 		self.abajo = 320
> 		self.y = random.randint(-210, 210)

> 	def actualizar(self):
> 		self.y -= 5
> 		pilasengine.actores.Bomba.actualizar(self)

> class Item(pilasengine.actores.Actor):

> 	def iniciar(self):
> 		self.imagen = 'estrella.png'
> 		self.escala = 0.5
> 		self.abajo = 320
> 		self.x = random.randint(-210, 210)
> 		
> 	def actualizar(self):
> 		self.abajo -= 5

> 		if self.arriba < -320:
> 			self.eliminar()	

> class Ayuda(pilasengine.escenas.Escena):
> 	"Es la escena que da instrucciones de como jugar."
> 	def iniciar(self):
> 		pilas.fondos.Fondo("DATA/ayuda.png")
> 		self.crear_texto_ayuda()
> 		self.pulsa_tecla_escape.conectar(self.cuando_pulsa_tecla)
>     
> 	def crear_texto_ayuda(self):
> 		pilas.actores.Texto("Ayuda",y = 200)
> 		pilas.actores.Texto(MENSAJE_AYUDA, y = 0)
> 		pilas.avisar("Pulsa ESC para recresar")
>         
> 	def cuando_pulsa_tecla(self, *k, **kw):
> 		pilas.escenas.MenuPrincipal()
>         


> class Jugar(pilasengine.escenas.Escena):
> 	
> 	def iniciar(self):
> 		pilas.fondos.Espacio()
> 		self.piedras = []
> 		self.crear_nave()
> 		self.crear_contador_de_vidas()
> 		self.cambiar_estado(Iniciando(self,1))
> 		self.puntaje = pilasengine.actores.Puntaje(x=280,y=220,color=pilasengine.colores.blanco)
> 		self.pulsa_tecla_escape.conectar(self.volver_al_menu_principal)
> 	def cambiar_estado(self,estado):
> 		self.estado = estado
> 		
> 	def crear_nave(self):
> 		nave = pilas.actores.NaveRoja()
> 		nave.aprender(pilas.habilidades.SeMantieneEnPantalla)
> 		nave.definir_enemigos(self.piedras,self.cuando_explota_asteroide)
> 		pilas.colisiones.agregar(nave,self.piedras, self.explotar_y_terminar)
> 		nave.y = -200
> 		nave.escala = 0.5
> 	
> 		
> 	def cuando_explota_asteroide(self):
> 		puntos.aumentar(10)
> 		puntos.escala = 2
> 		puntos.escala = [1], 0.2
> 		puntos.rotacion = random.randint(30, 60)
> 		puntos.rotacion = [0], 0.2

> 	def crear_contador_de_vidas(self):
> 		self.contador_de_vidas = ContadorDeVidas(3)
> 			
> 	def explotar_y_terminar(self,nave,piedra):
> 		"Responde a la colision entre la nave y una piedra."
> 		nave.eliminar()
> 		self.cambiar_estado(PierdeVida(self))

> 	def crear_piedras(self,cantidad):
> 		fuera_de_la_pantalla = [-600,-650,-700,-750,-800]
> 		tamanos = ["grande","media","chica"]
> 		for x in range(cantidad):
> 			x = random.choice(fuera_de_la_pantalla)
> 			y = random.choice(fuera_de_la_pantalla)
> 			t = random.choice(tamanos)
> 			piedra_nueva = PiedraEspacial(self.piedras,x=x,y=y,tamano=t)
> 			self.piedras.append(piedra_nueva)

> 	def ha_eliminado_todas_las_piedras(self):
> 		return len(self.piedras) == 0
> 	def volver_al_menu_principal(self, *k, **kw):
> 		pilas.escenas.MenuPrincipal()
> import random		
> class MenuPrincipal(pilasengine.escenas.Escena):
>             
> 	def crear_titulo_del_juego(self):
> 		logotipo = pilas.actores.Texto("Space Atack")
> 		logotipo.magnitud = 50
> 		logotipo.y = 300
> 		logotipo.y = [200]
>             
> 	def comenzar_a_jugar(self):
> 		pilas.escenas.Jugar()
>         
> 	def menu_ayuda(self):
> 		pilas.escenas.Ayuda()
>     
> 	def salir_del_juego(self):
> 		pilas.terminar()

> 	def menu_principal(self):
> 		opciones_menu = [("Jugar",self.comenzar_a_jugar),("Ayuda",self.menu_ayuda),("Salir",self.salir_del_juego)]
> 		self.menu = pilas.actores.Menu(opciones_menu, y = -50)
>     
> 	def iniciar(self):
> 		pilas.fondos.Galaxia()
> 		self.crear_titulo_del_juego()
> 		pilas.avisar(u"Use el teclado para controlar el menu.")
> 		self.menu_principal()
> 		self.crear_asteroides()

> 	def crear_asteroides(self):
> 		fuera_de_la_pantalla = [-600,-650,-700,-750,-800]
> 		
> 		for x in range(5):
> 			x = random.choice(fuera_de_la_pantalla)
> 			y = random.choice(fuera_de_la_pantalla)
> 			
> 			PiedraEspacial([],x=x,y=y,tamano="chica")
> 			

> pilas.actores.vincular(PiedraEspacial)
> pilas.escenas.vincular(Ayuda)
> pilas.escenas.vincular(Jugar)
> pilas.escenas.vincular(MenuPrincipal)
> pilas.escenas.MenuPrincipal()        
> pilas.ejecutar()

Buenas, @Fernando_Ariel_Franc !

UFFFFFFFFFFFFFFFF !!! bueno mira he estado más de tres horas revisando tu código y he encontrado algunos errores como que alguna clase no lleve el () o poner pilasengine en vez de pilas.(por ejemplo en el actor puntaje----> puntaje=pilas.actores.Puntaje() ).

Pero lo cierto es que tu código me resulta demasiado avanzado para mi nivel, con referencias cruzadas entre clases :cold_sweat:, y ciertamente creo no estar suficientemente preparado para solucionarte todos los problemas.

Anulando varias lineas de código que me daban error he podido iniciar la escena juego con la nave y el puntaje, pero sin los asteroides.

Si yo tuviera que realizar este juego simplificaria mucho el código, y en vez de tantas clases que me parecen prescindibles (estado, jugando, iniciando, contador_de_puntos, etc…) programaria comportamientos dentro de la escena Jugar. Es tan sólo una recomendación de alguien que humildemente te dice que seguramente su nivel de programación es inferior al tuyo, pero creo firmemente que muchas veces menos es más, y a veces queriendo hacer un juego muy elaborado obviamos soluciones mucho más simples.

Espero que alguien con mayores conocimientos de Python que yo pueda ayudarte mejor… :confused:

Un saludo.

hola! gracias por tomarte el tiempo de revisarlo yo de tanto revisar pase por alto muchas cosas… pero me ayudo mucho lo que me dijiste, ya pude arreglar la mayoria de los problemas que tenia… uno tras otro…
pero por fin pude hacerlo funcionar… sin que me tire algun error… hasta solucione lo de los asteroides, pero todavia no logro hacer que colisionen con la nave o exploten al dispararles.
en realidad esta es la primera vez que hago un juego en pilas, es un proyecto para una asignatura de la universidad use de guia varios ejemplos que encontre por ahi… mas que nada uno que esta en la pagina de pilas pero era para una version vieja de pilas asi que tuve que modificar muchas cosas y me volvi loco… fui leyendo el codigo de los actores de pilas para entender un poco mas… pero bueno en fin, muchisimas gracias me ayudaste un monton!