Junio 28, 2012, 10:51:37 PM Ultima modificación: Julio 05, 2012, 06:14:38 AM por Texic
Nombre del creador:
Lo he hecho totalmente yo, Mgbu


Función:
Es un sistema para parar la partida y mostrar una pantalla con un texto y una imagen, sirve para hacer pausas en el juego e ir contando la historia, para darle consejos o objetivos al jugador

Consiste en una pantalla negra con una imágen estática y dos líneas de texto, de 51 caracteres de largo cada una, con 3 pantallas, lo que permite mostrar 3 imágenes y 6 lineas de texto.
La gracia de esto es que el texto se va escribiendo progresivamente, eso es lo que lo hace más dificil de hacer

Esto es un engine no muy optimizado, funciona para pocas lineas, para mostrar animaciones en vez de fotos podrías tener problemas...

Debes cargar los 3 scripts, crear un objeto configurando el Create, Step y Draw como dice abajo, y crear una room (yo usé una de 320x240) con solo el objeto creado anteriormente


Versión de GM utilizada:
Sólo lo he probado con GM 8.0


Código:
Esto consiste de 3 scripts, un objeto, y una room vacía. Les cuento rapido como funciona
Citar- Por un evento X se guarda la partida, se guardan las caracteristicas de la presentacion en un ini
- Inmediatamente se va a una room vacía con el fondo preferido tuyo y sólo un objeto (el controlador)
- Ahí el controlador lee el .ini y guarda los datos en variables
// Acá empieza el dibujado//
- Con 2 for anidados va copiando partes del string que tiene la linea de texto a dibujar, así primero copia la primera letra, luego la primera y segunda, luego la primera, segunda y tercera... etc. Mientras va dibujando el texto copiado
- Cuando termina ese renglón pasa al siguiente haciendo lo mismo
- Cuando termina los dos renglones de la pantalla espera a que aprietes enter para continuar con la segunda pantalla (si hace falta)
- Cuando termine todas las pantallas simplemente carga el juego guardado, así cuando vuelva va a estar todo exactamente como estaba antes

Bueno, ahora lo importante, el código

Scripts

scr_mostrar_animacion(cant.lineas,linea1,linea2,linea3,...,linea6)
Con este script inicializamos la animación
[gml]
//argument0=cantidad de lineas
//argument1=linea1
//argument2=linea2
//argument3=...
//argument6=linea6
argumento[1]=argument1 //Para cambiar el argumento en el for...
argumento[2]=argument2
argumento[3]=argument3
argumento[4]=argument4
argumento[5]=argument5
argumento[6]=argument6

game_save('parttemp') //Guardamos la partida
ini_open('datos.temp') //Abrimos el ini
ini_write_real('Animacion','lineas',argument0) //Escribimos la cantidad de lineas
for (i=1; i<argument0+1; i+=1)
{
    ini_write_string('Animacion','linea'+string(i),argumento) //Vamos escribiendo las lineas
};
ini_close() //Cerramos el ini y vamos a la room de la animacion
room_goto(animacion)
[/gml]

scr_leer_animacion()
Este script es abierto por el objeto en el Create, no hace falta hacer nada con él
[gml]
ini_open('datos.temp') //Abrimos el ini
cantlineas=ini_read_real('Animacion','lineas',0) //Leemos la cantidad de lineas
for (i=1; i<cantlineas+1; i+=1)
{
    linea[i-1]=ini_read_string('Animacion','linea'+string(i),'ERROR :(') //Vamos leyendo las lineas
    dibujarlinea[i-1]='' //Vamos guardando espacio en memoria para no tener el error de 'Array out of bounds'
};
[/gml]

scr_cerrar_animacion()
Bueno, es cortito pero es para ordenar mejor las cosas, lo abre el objeto al terminar la animación
[gml]
game_load('parttemp') //Cargamos la partida y listo
[/gml]


obj_control_animacion
Esto es lo importante, modificando este objeto modificas como se verá en la pantalla

Create
[gml]
lineas_completadas=0 //Cantidad de lineas terminadas de escribir, contando las lineas de pantallas anteriores, Se cuenta como una linea a los dos renglones de la pantalla
pantalla=1 //Numero de pantalla
terminado=0 //Si se ha terminado de dibujar todas las pantallas
scr_leer_animacion() //Obtener la información del .ini
switch cantlineas //Para saber la cantidad de pantallas
{
    case 1: cantpantallas=1 break
    case 2: cantpantallas=1 break
    case 3: cantpantallas=2 break
    case 4: cantpantallas=2 break
    case 5: cantpantallas=3 break
    case 6: cantpantallas=3 break
}
[/gml]

Step
[gml]
if keyboard_check_pressed(vk_enter) and terminado=1
   {
   scr_cerrar_animacion() //Si apretas enter cuando se treminaron de dibujar todas las pantallas se vuelve al juego
   }
if keyboard_check(vk_enter) lineas_completadas+=1 //Al apretar enter se avanza de pantalla
if mouse_check_button(mb_left) lineas_completadas+=1
if lineas_completadas=0
    {
    for (i=0; i<2; i+=1) //Un for para saber el renglón
        {
        for (j=0; j<string_length(linea)+1; j+=1) //Otro for para el carácter
            {
            dibujarlinea=string_copy(linea,0,j) //Se copia hasta el caracter actual (j) de la linea actual (i)
            pantalla=1
            screen_redraw() //Se redibuja la pantalla, para ver los cambios, redibujar es ejecutar el evento Draw
            sleep(40) //Hacer una pausa para enfatizar la animacion
            }
        }
    lineas_completadas=1 //Se ha terminado un par de renglones
    if cantpantallas=1 terminado=1 //Si la animación solo tiene una pantalla ya hemos terminado
    io_clear() //Se borran los estados del teclado, para prevenir errores
    }
if cantlineas<=2 exit //Si hay una o dos lineas se sale del step

if lineas_completadas=2
    {
    for (i=2; i<4; i+=1) //Un for igual al anterior, se comienza con i=2 porque ya se han dibujado dos lineas
        {
        for (j=0; j<string_length(linea)+1; j+=1) //Esto ya es todo igual
            {
            dibujarlinea=string_copy(linea,0,j)
            pantalla=2
            screen_redraw()
            sleep(40)
            }
        }
    lineas_completadas=3
    if cantpantallas=2 terminado=1
    io_clear()
    }
if cantlineas<=4 exit

if lineas_completadas=4
    {
    for (i=4; i<6; i+=1)
        {
        for (j=0; j<string_length(linea)+1; j+=1)
            {
            dibujarlinea=string_copy(linea,0,j)
            pantalla=3
            screen_redraw()
            sleep(40)
            }
        }
    show_debug_message('Terminada linea')
    lineas_completadas=5
    if cantpantallas=3 terminado=1
    io_clear()
    }
[/gml]

Draw
[gml]
draw_set_font(font_terminal_6) //Seteamos los estilos...
draw_set_color(c_white)
if pantalla=1
   {
   draw_text(5,214,dibujarlinea[0]) //Si es la primer pantalla dibujamos las 2 primeras lineas
   draw_text(5,225,dibujarlinea[1])
   }
if pantalla=2
   {
   draw_text(5,214,dibujarlinea[2]) //Si es la segunda pantalla dibujamos las 2 segundas lineas
   draw_text(5,225,dibujarlinea[3])
   }
if pantalla=3
   {
   draw_text(5,214,dibujarlinea[4])
   draw_text(5,225,dibujarlinea[5])
   }
draw_rectangle(4,4,315,205,1) //Agregamos una foto linda arriba
draw_sprite(spr_anim_test,-1,5,5)
[/gml]


Listo!
CitarDebido a un bug que no es muy necesario arreglar en el script scr_mostrar_animacion, debes poner una cantidad de lineas par, por ejemplo si quieres mostrar una sola linea en el argument0 escribes 2, total la segunda linea no va a contener texto, lo mismo se debe hacer para 3 o 5 lineas
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


mereces un aplauso xDD (le doy, en serio xdd eres mi dios xd)
en http://krstudyos.blogspot.com solo hay basura... mejor que ni entres...

Cita de: SobacoEnLlamas en Junio 28, 2012, 11:13:55 PM
mereces un aplauso xDD (le doy, en serio xdd eres mi dios xd)
No se bien por que pero bueno, escribo para colocar el cartel de nuevo al post, ya que lo terminé XD
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy


por hacer lo que hiciste, ahora no disimules xD eres mi dios xD
en http://krstudyos.blogspot.com solo hay basura... mejor que ni entres...

Hola Mbgu.


Muy buen aporte, muy interesante y util.


Muchas gracias me sera de utilidad.


Saludos.

muy interesante y de mucha ayuda para un proyecto en el que trabajo, pero no me anda!
me da este error:


___________________________________________
ERROR in
action number 1
of Draw Event
for object obj_control_animacion:

Error in code at line 5:
      draw_text(5,214,dibujarlinea[0]) //Si es la primer pantalla dibujamos las 2 primeras lineas
                      ^
at position 21: Unknown variable dibujarlinea

___________________________________________
ERROR in
action number 1
of  Step Event
for object obj_control_animacion:

Error in code at line 11:
           for (j=0; j<string_length(linea)+1; j+=1) //Otro for para el carácter
                                     ^
at position 36: Unknown variable linea

si puedes ayudarme te lo agradeceria mucho

MMh, es raro. No se como podria llegar a pasar ya que para que el evento "draw" no reconozca al array "dibujarlinea" no se debería haber ejecutado el "step", pero el evento "step" es llamado antes que el "draw"
Lo unico que se me ocurre ahi es que mires si copiaste bien el "step"

Luego el segundo error ocurre porque no esta leyendo el texto desde el script "scr_leer_animacion()", que a su vez ese script lee al "datos.temp". Pero estoy seguro que el script se ejecuta porque el objeto conoce a cantlineas
Se me ocurre que has llamado mal al script "scr_mostrar_animacion", fijate si estas usandolo bien, eso funciona así:
"scr_mostrar_animacion(cant.lineas,linea1,linea2,linea3,...,linea6)"
Por ejemplo para mostrar esto en pantalla:
CitarBienvenid@ a la comunidad hispana de Game Maker.
Nuestro objetivo es crear videojuegos
y dar soporte en castellano de GM.
El scipt es llamado de esta manera:
scr_mostrar_animacion(4,"Bienvenid@ a la comunidad hispana de Game Maker. ","Nuestro objetivo es crear videojuegos ","y dar soporte en castellano de GM. ","")
Fijate que siempre hay que darle un numero par en "cant.lineas", luego escribes las lineas, y como en este caso "cant.lineas" es 4 y usamos 3, hay que hacer una linea sin texto

Si no podes encontrar el error podes pasarme el editable adjuntandolo cuando comentas en "Opciones Adicionales" a ver si encuentro el problema
El Manual

- Ley de la gravitación selectiva: toda herramienta se caerá donde produzca el mayor daño.
- Si todo parece estar bien, es obvio que uno no encontró el problema
- Todo aquello que se corte a medida resultara ser demasiado corto.
- Todo archivo borrado era necesario, todo archivo conservado es inutil
- Cuando a usted se le ocurra la solución ideal, alguien habrá resuelto ya el problema.

                                                               Murphy