PRGs
>> PRGs >> Pausa by Wakroo.

Te enfrentas al monstruo final. Has estado 5 horas jugando para llegar hasta aquí. Ya parece que empieza a debilitarse. Lo tienes ya a tu merced... y suena el teléfono, sales corriendo y para cuando has vuelto te han matado y tienes que volver a empezar. Situaciones como ésta dan ganas de borrar el juego en cuestión y no volver a verlo nunca.

En la mayoría de los juegos que se ven por estos lares esta opción no está disponible. Y la mayoría de las veces es porque al autor no se le ha ocurrido la forma de hacerlo. Pero es muy sencillo, sólo hay que estructurar el programa de forma adecuada.

La clave para poder pausar el juego está en la sentencia signal(). Si miráis la documentación veréis que admite dos parámetros. El primero es el código identificador del proceso al que hay que mandarle la señal, pero también se puede sustituir por TYPE nombreproceso para mandársela a todos los procesos de ese tipo. El segundo es el tipo de señal que vamos a mandar, con ocho opciones:

Si no tenéis claro eso de "afecta al proceso en cuestión y a toda su descendencia" podéis echarle un vistazo a Jerarquía de procesos.

Bueno, pues una vez que se conocen cómo funciona

El proceso "primigenio" no es más que un proceso que se va a encargar de llamar a todos los demás procesos necesarios para el juego, sin que tenga ningún tipo de gráfico. Luego entra en un bucle infinito (no olvidéis el FRAME, que si no el programa se cuelga) y se queda ahí dando vueltas. Es importante haber almacenado su código identificador, pues es la clave de todo este asunto.

El proceso de control va a ser el encargado de hacer la pausa propiamente dicha. Entra en un bucle donde comprobará en todo momento si se ha pulsado la tecla para pausar el asunto. Cuando suceda ejecutará la sentencia signal(idPrimigenio,s_freeze_tree). De esta forma el proceso "primigenio" y toda su descendencia quedará congelada: los enemigos no se moverán, el protagonista no responderá a las teclas, el escenario estará quieto,... Es decir, habremos pausado el juego. Mientras, el propio proceso de control puede poner un gráfico o un texto en pantalla indicando que se ha pausado o puede llamar a otro proceso para que haga lo que tenga que hacer (por ejemplo, poner un menú en pantalla y controlarlo).

En el momento en el que haya que quitar la pausa se mata a todos los procesos que hayamos llamado durante la pausa (menús o lo que sea), se borran los textos, se quitan los gráficos,... y entonces se ejecuta la sentencia signal(idPrimigenio,s_wakeup_tree. Con esto todos los procesos se despertarán y seguirán ejecutando su código exactamente donde lo dejaron, es decir, donde habíamos pausado. Se podrá seguir jugando tranquilamente y el proceso de control quedará en espera de que se vuelva a pulsar la tecla de pausa.

Naturalmente, este truquillo se puede usar para más cosas. Por ejemplo, imaginemos que cuando el protagonista llega a cierto punto del mapa hay que pararlo todo y poner una animación en pantalla. Entonces se usa la señal s_sleep_tree para pararlo todo y quitar los gráficos de la pantalla (dos pájaros de un tiro), se pone la animación y lo que haga falta y luego se usa s_wakeup_tree para ponerlo todo en marcha y que vuelvan a aparecer los gráficos. Una forma sencilla de intercalar la historia con el juego.

Bueno, pues esto es todo. Sencillo, ¿verdad? Si tenéis cualquier duda, sugerencia, petición o consulta escribidme un mail a lordwakroo@yahoo.es. Un saludo y que la Fuerza os acompañe.