Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mensajes - Mgbu

466
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
467
Juegos en desarrollo / Re:SHINOBI
Junio 28, 2012, 07:24:52 PM
Me parecio muy gracioso, 20 ninjas a cuchillazos XD
Tuve un bug, se pegaron como 10 ninjas a la pared y no paraban de darse cuchillazos XD
Me parecio que más de 3 ninjas enemigos a la vez es un gran lio, se hace una nube gris en donde si entras no salis XD
Otra cosa es que se puede moverse en el aire mientras se da cuchillazos, ayuda bastante
468
Ah, si sabes que son los arrate te va a ser fácil.
Viste que en los for esta la variable 'i'?
Bueno, hagamos de cuenta que el for dice esto:
for (i=0,i<5,i++)
{
auto[i]=0
}
El for esta haciendo que la variable sea 0, dice que se repetira mientras i<5, y que cada vez que se repita lo que dice dentro se le sumara 1 a i
Entonces como el array tiene i entre corchetes va a usar el valor de i
El primer ciclo i va a ser 0, entonces auto[0] se le va a poner el valor 0
En el segundo ciclo i va a ser 1, entonces se va a repetir lo mismo pero con auto[i]
Despues se repite con 2,3,4...
Pero no con 5!, porque i deja de ser menor que 5, como dice el for

Entonces esos arrays sirven para guardar en serie, o como se te ocurra

Espero que te sirva, lo escribi todo con el celular, chau, me voy a dormir XD

PD: Ahora que lo reviso el dia siguente veo que a [ i ] me lo toma como cursiva XD, así que lo meti todo en un code
469
Los arrays son iguales a las variables, la única diferencia es que de nombre también tienen un número, así que una variable auto=1 en array se podría decir auto1=1 auto2=5 auto3=2...
Obviamente el número va entre corchetes, auto[1]=1 auto[2]=5 auto[3]=2...
También se le pueden poner 2 números, auto[1,2]=2 auto[2,5]=5...
Sirve para hacer listas por ejemplo, si se hace una lista con los nombres de jugadores de un equipo sería:
jugador[0]='Pedro'
jugador[1]='Juan'
jugador[2]='Martin'
...
470
No se, pero sólo es un texto, con la fuente 'Berlin Sans FB Demi', también se está viendo de cambiarlo: http://www.comunidadgm.org/index.php?topic=16907.15

EDIT: Vieno el código fuente, se logra ver que la imágen está guardada en http://www.comunidadgm.org/Themes/inferno_20rc4/images/custom/logo.png
Y es esta:
471
Me siento un estupido, no encuentro el problema :-\

Te refieres a que cuando caes se corta la animacion de disparo? que debería seguir po un ratitito mas?
472
Ya encontré el error, el problema es que la variable global.destruido afecta a todos los enemigos, entonces un enemigo destruido afecta a los sanos y viceversa. Para eso necesitas una variable independiente de cada enemigo
Para eso cambié los global.destruido a simplemente destruido (sin el global)
Después para comprobarlo con la baja en vez de usar if global.destruido=0 usas other.destruido=0, eso se traduce "si el destruido del otro es 0"
473
Oh dios, no puedo recrear el problema, se dispara con la Z y se salta con la X no?
474
Uy perdon perdon :-[ no lo había visto

No encuentro el problema, me fijé en debug pero parece que todas las variables van bien, la variable cayendo sólo es true cuando cae. Probé disparando antes y luego de salta y de las dos maneras veo la animación, la animación que veo es cuando se agarra la mano con el cañon con la otra mano apuntando hacia delante
475
Puedes pasar el editable :D
476
Bueno, lo arreglé, abajo escribo el código pero si alguien sabe la respuesta de lo que pregunté arriba se lo agradecería para ordenar un poco el código

Acá está el resultado sin un ciclo que espere, es más complicado con tantas variables pero funciona :D
[gml]
if keyboard_check_pressed(vk_enter) and terminado=1
   {
   scr_cerrar_animacion()
   }
if keyboard_check(vk_enter) completado+=1
if mouse_check_button(mb_left) completado+=1
if completado=0
{
for (i=0; i<2; i+=1)
    {
    for (j=0; j<string_length(linea)+1; j+=1)
        {
        dibujarlinea=string_copy(linea,0,j)
        show_debug_message(dibujarlinea)
        pantalla=1
        screen_redraw()
        sleep(40)
        }
    }
show_debug_message('Terminada linea')
completado=1
if cantpantallas=1 terminado=1
io_clear()
}
if cantlineas<=2 exit

if completado=2
{
for (i=2; i<4; i+=1)
    {
    for (j=0; j<string_length(linea)+1; j+=1)
        {
        dibujarlinea=string_copy(linea,0,j)
        show_debug_message(dibujarlinea)
        pantalla=2
        screen_redraw()
        sleep(40)
        }
    }
show_debug_message('Terminada linea')
completado=3
if cantpantallas=2 terminado=1
io_clear()
}
if cantlineas<=4 exit

if completado=4
{
for (i=4; i<6; i+=1)
    {
    for (j=0; j<string_length(linea)+1; j+=1)
        {
        dibujarlinea=string_copy(linea,0,j)
        show_debug_message(dibujarlinea)
        pantalla=3
        screen_redraw()
        sleep(40)
        }
    }
show_debug_message('Terminada linea')
completado=5
if cantpantallas=3 terminado=1
io_clear()
}
[/gml]
477
Significa not
Es decir "si vspeed no es igual a 0"
478
Estoy en una parte en donde no se lo que hago realmente XD, estoy modificando un poco el bucle principal del juego que impone GM de "step y despues draw"

Estoy haciendo una pantalla en donde muestra un poco la historia del juego, en donde hay un texto y una imagen
El texto se va escribiendo progresivamente como los juegos retro y me encanta, el problema es que quiero esperar hasta que el jugador presione enter para seguir contando la historia

Lo unico importante es que quiero hacer un ciclo infinito hasta que uno presione enter, lo que hice fue esto:

[gml]
cerrado=false
while cerrado=false
    {
    if keyboard_check_pressed(vk_enter) cerrado=true
    show_debug_message('Esperando enter')
    screen_redraw()
    }
[/gml]

Supuestamente ese código espera a que presiones enter para continuar con el evento, step en este caso:

[gml]
for (i=0; i<2; i+=1)
    {
    for (j=0; j<string_length(linea)+1; j+=1)
        {
        dibujarlinea=string_copy(linea,0,j)
        show_debug_message(dibujarlinea)
        pantalla=1
        screen_redraw()
        sleep(40)
        }
    }
show_debug_message('Terminada linea')
if cantlineas<=2 exit
/*cerrado=false
while cerrado=false
    {
    if keyboard_check_pressed(vk_enter) break
    show_debug_message('Esperando enter')
    screen_redraw()
    }*/
for (i=2; i<4; i+=1)
    {
    for (j=0; j<string_length(linea)+1; j+=1)
        {
        dibujarlinea=string_copy(linea,0,j)
        show_debug_message(dibujarlinea)
        pantalla=2
        screen_redraw()
        sleep(40)
        }
    }
show_debug_message('Terminada linea')
if cantlineas<=4 exit
/*cerrado=false
while cerrado=false
    {
    if keyboard_check_pressed(vk_enter) break
    show_debug_message('Esperando enter')
    screen_redraw()
    }*/
for (i=4; i<6; i+=1)
    {
    for (j=0; j<string_length(linea)+1; j+=1)
        {
        dibujarlinea=string_copy(linea,0,j)
        show_debug_message(dibujarlinea)
        pantalla=3
        screen_redraw()
        sleep(40)
        }
    }
show_debug_message('Terminada linea')
[/gml]
Lo comentado es el código que muestro arriba (que no funciona)
Yo quiero esperar a que presiones enter en esos 2 lugares

Descomentando eso queda esperando a que apretes enter y muestra los síntomas clásicos de un ciclo infinito :-\
479
Lo que te conté es para bloquear los niveles a los que no llegaste, hacer el menú es otra cosa. Tenés que poner objetos, uno para cada habitación, no se una forma rápida pero lo que hice yo fue:
Hacer un obj_boton, en el evento de mouse pressed haces algo así como
if x=20 and y=20 room_goto(nivel1)
if x=40 and y=20 room_goto(nivel2)
if x=60 and y=20 room_goto(nivel3)
...


Después si tengo tiempo te hago un ejemplo
480
Podrías desbloquear los niveles que estén escritos en un txt o ini, entonces ahí guardas los niveles completados y a los otros los bloqueas. Es depende si sabes manejar los recursos externos