Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

* Sponsor

Comunidad Game Maker

Bienvenid@ a la comunidad hispana de Game Maker. Nuestro objetivo es crear videojuegos y dar soporte en castellano de GM. Para mejorar nuestro servicio hemos implantado, como adicion al reglamento general, algunas normas especificas en los subforos más comunes. ¡No olvides informarte antes de participar!.

Autor Tema: Diaologo letra por letra.  (Leído 830 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado AnthonyGamer

en: Abril 23, 2021, 09:59:51 pm
Hi! Help me pls, implementé, mis dialogo, todo bien, tambien hice que fueran letra por letras, todo bien, PERO este es un problema que PRIMERA Vez que me pasa,
si estás cerca de un NPC y presionas la tecla "T" pone el dialogo, MÁS, al terminar el dialogo vuelve a empezar, es obvio lo que pasa, antes de terminar el texto, hay que presionar
la tecla "T" entonces al terminar el dialogo en vez  de destruirse la queridisima, instancia, vuelve a empezar la hija de su madre,
CODIGO!!

obj_dialogo
Event Create:

tm=2;
con=0;
post=1;
alarm[0]=tm;
global.fin="";
esc=false;
frame=0;
if instance_exists(obj_linkR)//Esto para el movimiento de link mirando a la Derecha(Right)(ignorenlo)
{obj_linkR.canmove=false};
if instance_exists(obj_linkL)//Esto para el movimiento de link mirando a la Izquierda(Left)(ignorenlo tambien)
{obj_linkL.canmove=false};

Event Alarm[0]:

var cop;
cop=string_char_at(global.texto[con],post);
global.fin+=cop;
post+=1;
alarm[0]=tm;

if(cop="" or cop=" ")
{}
else{
frame=post mod 2;
//sound_play(snd_generico);
}

if(cop=""){
esc=true;
frame=0;
}
Event keyboard_pressed T:

if (esc){
if(con<=global.maxi)
{
con+=1;
post=1;
cop="";
global.fin="";
alarm[0]=tm;
esc=false;
}


if!(con>global.maxi)
{instance_destroy();}
}else{
global.fin=global.texto[con];
post=string_length(global.texto[con])+1;
}
Event Destroy

if instance_exists(obj_linkR)//ignorar(esto es para liberar a link)
{obj_linkR.canmove=true};
if instance_exists(obj_linkL)//Tambien
{obj_linkL.canmove=true};

Scrip: scr_textos
global.texto[argument0] = argument1;

scr_textos_end
global.maxi=argument0;

Uuuuuff, Ahora un objeto usando esa wea:
if distance_to_object(obj_linkR)<3 or distance_to_object(obj_linkL)<3
{
if !instance_exists(obj_dialogo) and keyboard_check_pressed(ord('T'))
{instance_create(view_xview[0]+2.5,view_yview+140,obj_dialogo);
    scr_textos(1,"¡Hola Link!");
    scr_textos(2,"¿Que tal estas el dia de hoy?");
    scr_textos(3,"¡Espero que Bien!");
    scr_textos(4,"Bueno...#Nos Vemos despues?");
    scr_textos(5,"mejor me apresuro");
    scr_textos(6,"de hecho");
    scr_textos(7,"¡Adios!");
    scr_textos_end(7)
}}
Y YA!
Help Me Please

 


No Tienes Permisos Para Dar Puntos
point 0 Puntos

Este tema no recibió puntos.


Desconectado Void

Respuesta #1 en: Abril 24, 2021, 05:18:13 am
Agrega keyboard_clear(ord("T")) al final del evento keyboard_pressed T del obj_dialogo.

Keyboard_clear limpia el estado de la tecla, de manera que no se ejecutarán eventos o comprobaciones que dependan de la tecla después de usada la función. Los eventos relacionados al teclado se ejecutan entre Begin Step y Step, al ponerla al final del evento keyboard_pressed T previenes que el mismo teclazo sea usado luego en el evento Step para crear otro dialogo.

 


Desconectado AnthonyGamer

Respuesta #2 en: Abril 24, 2021, 07:18:50 am
Bro! me funciono de perlas 8)
pero hay un problem ???

si se muestra el 1er texto es mucho, ya que después la tecla no hace efecto,
pero bueh, será mejor checar si está en la ultima linea de texto y después ocurra tu ingeniosidad :)

 


Desconectado AnthonyGamer

Respuesta #3 en: Abril 24, 2021, 08:02:41 am
NO FUNCIOOOOOOOOOooOooOooooNA!!! solo se muestra el 1er texto :( que desgracia, pero bueno gracias
(PD: se me olvido poner el Event Draw, pero es lo basico, letras blancas, dibuja el texto y el sprite indexado(Tipico)
Event Draw:
draw_self();
scr_draw_text();
draw_set_color(c_white);
draw_set_font(fnt_text1);
Scrip: scr_draw_text:
nn=c_black
ww=c_white
draw_set_font(fnt_text1)
draw_text_ext_color(view_xview[0]+14,view_yview[0]+143,string(global.fin),20,300,nn,nn,nn,nn,1);
draw_text_ext_color(view_xview[0]+16,view_yview[0]+145,string(global.fin),20,300,nn,nn,nn,nn,1);
draw_text_ext_color(view_xview[0]+15,view_yview[0]+144,string(global.fin),20,300,nn,nn,nn,nn,1);
draw_text_ext_color(view_xview[0]+15,view_yview[0]+144,string(global.fin),20,300,nn,nn,nn,nn,1);
draw_text_ext_color(view_xview[0]+15,view_yview[0]+144,string(global.fin),20,300,ww,ww,ww,ww,1);)

 


Desconectado Void

Respuesta #4 en: Abril 24, 2021, 10:45:28 am
Raro, hasta donde veo debería funcionar, pero entonces cambiemos de táctica.

Agrega en el evento Create de obj_dialogo una variable nueva, ponle el nombre que quieras, para efectos de este ejemplo la llamaré doomed, e iníciala en 0.

tm=2;
con=0;
post=1;
alarm[0]=tm;
global.fin="";
esc=false;
frame=0;
if instance_exists(obj_linkR)//Esto para el movimiento de link mirando a la Derecha(Right)(ignorenlo)
{obj_linkR.canmove=false};
if instance_exists(obj_linkL)//Esto para el movimiento de link mirando a la Izquierda(Left)(ignorenlo tambien)
{obj_linkL.canmove=false};

doomed = 0;

Luego en el evento keyboard_pressed T de obj_dialogo cambia instance_destroy(); por doomed = 1;

if (esc){
if(con<=global.maxi)
{
con+=1;
post=1;
cop="";
global.fin="";
alarm[0]=tm;
esc=false;
}


if!(con>global.maxi)
{//instance_destroy();
doomed = 1;}
}else{
global.fin=global.texto[con];
post=string_length(global.texto[con])+1;
}

Finalmente agrega un evento End Step al obj_dialogo y en el pon una comprobación para que si el valor de la variable es 1 la instancia sea destruida.

if (doomed == 1)
{instance_destroy();}

Con esto retrasas la destrucción de la instancia hasta el final del step, y debería evitar la creación de nuevos obj_dialogos.

 


Desconectado AnthonyGamer

Respuesta #5 en: Abril 24, 2021, 01:44:11 pm
OK, aunque la varable nueva tiene que ser igual a con
doomer=con
(por que Con es el contador de las lineas)
ya que no todos mis dialogos no van a llevar 1 linea de texto xD XD
amenos que la haga global.

 


Desconectado Void

Respuesta #6 en: Abril 24, 2021, 08:43:28 pm
La variable no cuenta cuantas líneas de texto han pasado, la usamos como una variable booleana que determina cuando se puede eliminar la instancia, por uso usamos la misma condición en que eliminabas la instancia en el código original.

El objetivo es que en el step que la instancia debe ser eliminada esperar hasta el final de dicho step para saltarnos el if !instance_exists(obj_dialogo) and keyboard_check_pressed(ord('T')) del objeto que crea nuevos diálogos.

El problema que tienes es que cuando terminas un dialogo se cumplen las condiciones para crear otro, es decir, ya no existe una instancia de obj_dialogo y la tecla T acaba de ser presionada, y la solución es hacer que al menos una de esas condiciones no se cumpla.

 
Los siguientes usuarios dieron las gracias a este tema: AnthonyGamer