PYGAME: Repetir tecla

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

PYGAME: Repetir tecla

Notapor Aruwert » Dom Abr 01, 2012 9:51 pm

Hola a todos.

Llevo un mes programando en general, y he empezado con Python y Pygame. La cosa es que estoy creando una aventura gráfica y me he encontrado con un problema, que seguramente tiene fácil solución, pero no logro encontrarla.
Me gustaría saber:

¿Como puedo asignar a una tecla (K_SPACE en mi caso) la función de ir pasando de páginas?

Hice esto:
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
historia()

def historia()
etc.

Ahora me gustaría poder, desde historia(), darle a (K_SPACE) y que me lleve a lo que definí como historia2()

Si no me he explicado bien, díganmelo. Muchas gracias de antemano.

Saludos!
Vive y deja vivir!
Avatar de Usuario
Aruwert
 
Mensajes: 2
Registrado: Lun Mar 19, 2012 12:48 am

Re: PYGAME: Repetir tecla

Notapor hugoruscitti » Lun Abr 02, 2012 1:09 am

Buenas Aruwert, es interesante tu pregunta. En realidad no hay una
sola forma de resolver lo que necesitas, pero hay estrategias.

Lo mas sencillo, sobre todo si estás comenzando, es tener una variable
auxiliar que indique "qué página de la historia estás mirando". Esa
variable te puede ayudar a saber qué mostrar cuando se pulse una
tecla.

Por ejemplo, algo así:

Código: Seleccionar todo
if event.type == KEYDOWN:
    if event.key == K_SPACE:
        if pagina_actual == 1:
             mostrar_pagina_2()
             pagina_actual == 2
        elif pagina_actual == 2:
             mostrar_parte_3()
             pagina_actual = 3 .... etc



Pero.... por supuesto esta no es la única forma. Si tu juego es
pequeño está todo bien, lo de antes sirve. Si tu juego es mas
grande, hay peligro de que tu código se vuelva un spaguetti !!

Si quieres una solución mas elegante, tal vez te resulte útil ver
el patrón de diseño state, del que hablamos una vez en otro
post:

viewtopic.php?t=170

(en ese mensaje, buscá mi respuesta y la parte en donde hablo de
Escena).

Saludos!
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: PYGAME: Repetir tecla

Notapor Aruwert » Lun Abr 02, 2012 5:38 pm

Muchísimas gracias por la ayuda, me has aclarado mucho las ideas.

Pero sí, digamos que el juego está únicamente compuesto de páginas, y sí, se volvería todo lioso..
Me gustaría, si no es mucha molestia, que me explicaras un poco por encima como podría utilizar las "Escenas" en mi juego.
Yo mientras tanto, voy probando. Quizá no es tan fácil, pero prefiero hacer las cosas bien desde el principio jaja.

Desde luego, qué de posibilidades tiene este mundo!

Saludos y gracias de nuevo, Hugo!
Vive y deja vivir!
Avatar de Usuario
Aruwert
 
Mensajes: 2
Registrado: Lun Mar 19, 2012 12:48 am

Re: PYGAME: Repetir tecla

Notapor hugoruscitti » Mar Abr 03, 2012 1:57 am

Buenas!

A simple vista el patrón state es un poquito difícil, pero dá muy buenos resultados.

La idea general, es construir una clase por cada escena. Por ejemplo, una para la
prensentación, una para el menú y otra para el juego. Durante la ejecución de tu
juego, solamente va a existir una sola escena activa (o instanciada).

Y como tu juego va a tener varias escenas, tendrías que crear al menos
un objeto que pueda maniplarlas, es decir, pasar de una escena a otra y
mantenerlas en ejecución. A este objeto se lo suele llamar "director" o "mundo".

Te escribo una idea general:

class Mundo:

def __init__(self):
self.iniciar_ventana()
self.cambiar_escena(EscenaIniciar(self))

def cambiar_escena(nueva_escena):
self.escena = nueva_escena

def iniciar(self):
# bucle principal.
while True:
for evento in pygame.events.get():
self.escena.cuando_ocurre_evento(evento)
self.escena.actualizar()
self.dibujar_ventana()
pygame.time.sleep(10)


Es decir, la clase Mundo serviría para representar al juego completo, tienes
una función para crear la ventana, para definir la escena principal
y el bucle de juego.

Esta clase se encargaría de capturar eventos y pasárselos a una escena, y a
su vez, la escena es la que implementará una parte del juego y dará la orden
de pasar a otra escena:

class EscenaMenu:
def __init__(self, mundo):
self.mundo = mundo

def actualizar(self):
# este metodo se llamará frecuentemente (desde el bucle principal).
pass

def cuando_ocurre_evento(self, evento):
if evento.type == KEYDOWN:
if evento.key == K_SPACE:
self.mundo.cambiar_escena(EscenaJuego(self.mundo))


Entonces, la escena solamente va a tener los métodos iniciar, actualizar y
"cuando_ocurre_evento". Podrías agregar mas cosas, pero en general con
esos 3 alcanza...

Voy a intentar escribir algún programita de ejemplo en la semana, si llego
a encontrar algo de tiempo te aviso y lo publico en la sección de ejemplos
de losersjuegos.

Saludos!
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Re: PYGAME: Repetir tecla

Notapor shackra » Jue Abr 19, 2012 10:11 pm

la vaina es, mr Hugo, que yo en mis años de estar aqui en LosersJuegos, nunca comprendí ese metodo para manejar escenas, pero con esa explicacion y la madurez que siento con respecto a Python, puede que ahora si pueda hacer juegos como Dios manda :P
Avatar de Usuario
shackra
 
Mensajes: 308
Registrado: Lun Jun 15, 2009 4:10 pm
Ubicación: Costa Rica


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado