Hola como estan??? mi pregunta es como haria para que el actor se desplace
por la plataforma de un mundo que tengo creado???, osea un estilo supermario o todos esos juegos de plataforma 2d donde a medida que el personaje avanza la pantalla se va actualizando mostrando parte del mundo.
osea una para en la escena de juego el actor se vaya desplanzando por ella tendria que crear una clases Nivel???
¡Hola Cristian!
Para realizar un desplazamiento del escenario me parece que lo mejor es usar el objeto “cámara” de pilas, este objeto básicamente te permite hacer paneos.
Por ejemplo, si quieres mover la cámara hacia la derecha podrías escribir:
camara = pilas.escena_actual().camara
camara.x = 100
o si hay un personaje en una posición del escenario y lo quieres enfocar:
camara.x = personaje.x
o lo mismo pero con una animación:
camara.x = [personaje.x]
Para que te des una idea, en el juego shaolin fury estamos siguiendo al protagonista usando un paneo con animación:
Otra opción es simular el desplazamiento de la cámara, moviendo el escenario, como hacemos en el juego de la vaca:
Ahora hago unos arreglos en la nueva versión de pilas e intento gravar un demo mostrando cómo usar la cámara. Avisame si te sirven estos datos.
¡Abrazo!
la camara la deberia poner como un atributo para que siga al personaje en el paneo?
Si, si por ejemplo podrías colocar el código “pilas.camara.x = self.x” dentro del método actualizar del actor.
Te paso un video haciendo un seguimiento del actor con la cámara:
Hola Hugo como estas? he dado un monton de vueltas con el codigo
intentado ver como hacer agregar la camara y lograr el paneo del actor
lo puse en varias clases el tema es que en ninguna funciona inclusive hice
cuando defini la variable asignandolo la clase Mario y no funciona,osea no sigue el paneo,cuando el personaje llega al final de la ventana sigue sin que la camara lo siga…
en este te paso un ejemplo de donde lo puse:
esta porcion de codigo se encuentra en la clase caminando igual no funciona:
‘’’ self.camara=pilas.escena_actual().camara
def actualizar(self):
self.camara=self.avanzar_animacion()
‘’’
class Mario(Actor):
def __init__(self, x=0, y=0):
pilas.actores.Actor.__init__(self, x=x, y=y)
self.imagen = pilas.imagenes.cargar_grilla("papermario2.png",4)
self.arriba = 90
self.izquierda = -320
self.hacer(Esperando())
def definir_cuadro(self, indice):
self.imagen.definir_cuadro(indice)
def actualizar(self):
pilas.camara.x=self.arriba
class Esperando(Comportamiento):
def iniciar(self, receptor):
self.receptor = receptor
self.receptor.definir_cuadro(0)
def actualizar(self):
if pilas.escena_actual().control.izquierda:
self.receptor.hacer(Caminando())
elif pilas.escena_actual().control.derecha:
self.receptor.hacer(Caminando())
if pilas.escena_actual().control.arriba:
self.receptor.hacer(Saltando())
class Caminando(Comportamiento):
def iniciar(self, receptor):
self.receptor = receptor
self.cuadros = [0,0,0,0,0,2,2,2,2,2]
self.paso = 0
self.camara=pilas.escena_actual().camara
def actualizar(self):
self.camara=self.avanzar_animacion()
if pilas.escena_actual().control.izquierda:
self.receptor.x -= Velocidad
self.receptor.espejado = True
elif pilas.escena_actual().control.derecha:
self.receptor.x += Velocidad
self.receptor.espejado = False
else:
self.receptor.hacer(Esperando())
if pilas.escena_actual().control.arriba:
self.receptor.hacer(Saltando())
def avanzar_animacion(self):
self.paso += 1
if self.paso >= len(self.cuadros):
self.paso = 0
self.receptor.definir_cuadro(self.cuadros[self.paso])
class Saltando(Comportamiento):
def iniciar(self, receptor):
self.sound= pilas.sonidos.cargar('saltar.wav')
self.dy = 10
self.receptor = receptor
self.receptor.definir_cuadro(3)
self.origen = self.receptor.y
self.sound.reproducir()
def actualizar(self):
self.receptor.y += self.dy
self.dy -= 0.2
if self.receptor.y < self.origen :
self.receptor.y = self.origen
self.receptor.hacer(Esperando())
if pilas.escena_actual().control.izquierda:
self.receptor.x -= Velocidad
elif pilas.escena_actual().control.derecha:
self.receptor.x += Velocidad
Hola Cristian, por lo que veo en tu código, solo tendrías que cambiar el código del método actualizar, algo así:
class Mario(Actor):
def __init__(self, x=0, y=0):
pilas.actores.Actor.__init__(self, x=x, y=y)
self.imagen = pilas.imagenes.cargar_grilla("papermario2.png",4)
self.arriba = 90
self.izquierda = -320
self.hacer(Esperando())
def definir_cuadro(self, indice):
self.imagen.definir_cuadro(indice)
def actualizar(self):
pilas.camara.x = self.x
Con eso, cada vez que se dibuje el actor Mario, la cámara lo va a enfocar.
Hola hugo,no funciona!!! :(…
te puedo pasar el archivo con el codigo?? voy a investigar de todas formas eliminando la clase caminando y agregando todo ahi en la clase mario.es lo que se me esta ocurriendo como ultima porque cambie un monton de cosas y sale
¡Hola Cristian!, si, enviame el código y lo reviso.
hola hugo gracias por responderme,yo te lo envie por correo porque no se como enviartelo por aca.
¡Hola Cristian!, ahí pude encontrar el problema, tendrías que agregar la palabra escena_actual()
antes de cámara:
si lo probe y funciona perfecto gracias hugo!!!.
me podrias explicar porque la llamada al modulo escena_actual antes???
lo vi en controles tambien pero no entendi el porque de su declaracion…
a mi entender seria que el metodo de la camara en la clase mario se actualiza
dentro de la escena_actual para realizar el paneo del Actor cuando se dibujan los movimiento.
Hola Cristian!, las escenas son una forma de dividir el juego en partes, por ejemplo el menú es una escena, la introducción otra etc…
En el tutorial de pilas hay una descripción mas detallada de que se trata: