Hola @Destroyer, con respecto a mantener la nave en pantalla me parece que lo más sencillo es usar esta sentencia:
nave.aprender("seMantieneEnPantalla")
Con esa linea, le estarías aplicando a la nave la habilidad de salir y reingresar automáticamente como hace pacman o los mismos asteroides en el juego. Es decir, si la nave sale por la derecha de la pantalla automáticamente va a reingresar por la izquierda.
Otra opción, es agregar una función para que la nave se mantenga en los límites de la pantalla pero que no pueda salir de ninguna manera:
def mantener_en_pantalla(t):
if nave.arriba > pilas.alto() / 2:
nave.arriba = pilas.alto() / 2
if nave.abajo < -pilas.alto() / 2:
nave.abajo = -pilas.alto() / 2
if nave.derecha > pilas.ancho() /2:
nave.derecha = pilas.ancho() /2
if nave.izquierda < -pilas.ancho() /2:
nave.izquierda = -pilas.ancho() /2
pilas.eventos.actualizar.conectar(mantener_en_pantalla)
Las dos opciones son válidas, depende de qué te gustaría que suceda cuando la nave está por salir de la pantalla.
Con respecto a tu otra consulta, cómo reiniciar el juego, lo ideal es que impletementes el juego en una escena separada, así vas a poder reiniciarla fácilmente. A grandes rasgos, para llevar el código de tu juego en una escena hay que crear una clase y poner todo el código dentro de esa clase.
Acá va el código completo de cómo me imagino que podrías implementarlo en tu juego, agregué un botón para reiniciar el juego que aparece una vez que la nave explota:
Código:
# coding: utf-8
import pilasengine
pilas = pilasengine.iniciar()
class Juego(pilasengine.escenas.Escena):
def iniciar(self):
self.juego_perdido = False
fondo = pilas.fondos.Galaxia()
nave = pilas.actores.Nave()
self.nave = nave
puntaje = pilas.actores.Puntaje(x=-300, y=200, color='blanco')
self.puntaje = puntaje
piedra = pilas.actores.Piedra()
piedra.x = 200
piedra.dx = pilas.azar(1, 2)/2.0
piedra.dy = pilas.azar(1, 2)/2.0
pilas.colisiones.agregar('Nave', 'Piedra', self.cuando_colisiona_con_la_nave)
pilas.colisiones.agregar('Misil', 'Piedra', self.cuando_colisiona_disparo_con_piedra)
pilas.tareas.siempre(3, self.crear_piedra)
def actualizar(self):
self.mantener_en_pantalla()
## Colision nave / piedra
def cuando_colisiona_con_la_nave(self):
explosion = self.pilas.actores.Explosion()
explosion.x = self.nave.x
explosion.y = self.nave.y
self.nave.eliminar()
self.pilas.avisar("Juego perdido!")
self.crear_boton_reintentar()
self.juego_perdido = True
def crear_boton_reintentar(self):
boton = pilas.interfaz.Boton("Reintentar")
boton.conectar(pilas.escenas.Juego)
## Colision disparo
def cuando_colisiona_disparo_con_piedra(self, disparo, piedra):
explosion = self.pilas.actores.ExplosionDeHumo()
explosion.x = piedra.x
explosion.y = piedra.y
disparo.eliminar()
piedra.eliminar()
self.puntaje.aumentar()
def mantener_en_pantalla(self):
alto = 250
ancho = 320
if self.nave.arriba > alto:
self.nave.arriba = alto
if self.nave.abajo < -alto:
self.nave.abajo = -alto
if self.nave.derecha > ancho:
self.nave.derecha = ancho
if self.nave.izquierda < -ancho:
self.nave.izquierda = -ancho
def crear_piedra(self):
# Evita crear una piedra si el juego termino
if self.juego_perdido:
return
piedra = self.pilas.actores.Piedra()
piedra.x = 200
piedra.dx = self.pilas.azar(1, 2)/2.0
piedra.dy = self.pilas.azar(1, 2)/2.0
piedra.y = 300
pilas.escenas.vincular(Juego)
pilas.escenas.Juego()
pilas.ejecutar()
Avisanos cualquier cosa!