Usa la función .typewriter_reset para reiniciar la posición del efecto.
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.
61
Preguntas y respuestas / Re: Bug, no funciona el efecto de maquina de escribir la segunda vez que lo usas
Febrero 24, 2021, 11:16:18 PM62
Preguntas y respuestas / Re:Como poner una puerta en una mazmorra aleatoria
Enero 21, 2021, 10:03:44 PM
Ah, ahora entiendo lo que quieres, en ese caso lo mas simple es hacer que el script crear_sala cree una puerta en la entrada de cada sala, y despues de que generar_laberinto haya corrido eliminar todas las puertas menos la última creada, de manera que solo la última sala tenga puerta.
63
Preguntas y respuestas / Re:Funcionamiento de get_save_filename() y get_open_filename() cambio de directorio
Enero 21, 2021, 06:31:47 AM
Las funciones de archivos del GMS estan limitadas por el sandbox, lo que significa que solo puede leer archivos es sus carpetas raiz y temporal, y solo puede crear archivos en su carpeta temporal. El sandbox puede desactivarse en GMS 2, pero ciertas carpetas siguen siendo inaccesibles para escritura aún con el sandbox desactivado, especificamente la carpeta raiz y las carpetas de sistema.
Las funciones get_save_filename() y get_open_filename() otorgan respectivamente permiso de escritura y permiso de lectura para la ruta seleccionada, de esta manera se pueden manipular archivos fuera del sandbox sin desactivarlo, pero el permiso es temporal y caduca cuando se cierra el juego.
Tambien, en strings el GMS 2 usa la barra invertida (\) como caracter de escape, esto significa que si no encuentra un caracter perteneciente a una secuencia de escape seguido de la barra invertida la ignora, para usarla en una string debe usarse doble (\\) o indicar al GM que debe leer la string literalmente agregando un arroba (@) al inicio de la string:
directorio = "C:\\Users\\Alemar5_2\\Desktop\\test\\"
directorio = @"C:\Users\Alemar5_2\Desktop\test\"
Las funciones get_save_filename() y get_open_filename() otorgan respectivamente permiso de escritura y permiso de lectura para la ruta seleccionada, de esta manera se pueden manipular archivos fuera del sandbox sin desactivarlo, pero el permiso es temporal y caduca cuando se cierra el juego.
Tambien, en strings el GMS 2 usa la barra invertida (\) como caracter de escape, esto significa que si no encuentra un caracter perteneciente a una secuencia de escape seguido de la barra invertida la ignora, para usarla en una string debe usarse doble (\\) o indicar al GM que debe leer la string literalmente agregando un arroba (@) al inicio de la string:
directorio = "C:\\Users\\Alemar5_2\\Desktop\\test\\"
directorio = @"C:\Users\Alemar5_2\Desktop\test\"
64
Preguntas y respuestas / Re:Filtrar contenido de un script
Enero 21, 2021, 06:29:31 AM
Por defecto ctrl+shift+f abre la ventana de búsqueda y remplazo global, y ctrl+f abre la ventana de búsqueda y remplazo local cuando estas en una ventana de código, la ventana de remplazo local no crea una lista de las coincidencias encontradas, y solo busca en la ventana actual. No existe actualmente una manera de limitar una búsqueda a todo el código de un solo objeto pero la lista de coincidencias de la búsqueda global aparece en orden de manera que todas las coincidencias de un objeto apareceran una tras otra.
65
Preguntas y respuestas / Re:Como poner una puerta en una mazmorra aleatoria
Enero 21, 2021, 06:19:30 AM
Ok, empezar por decir que esta no es la unica manera de hacerlo, y no es necesariamente la manera más eficiente de hacerlo, es simplemente la manera en que se me ocurrio para hacerlo sin hacer muchos cambios al código ya existente.
Primero, declara una variable en el objeto obj_bloque, la llamaremos Remplazable y la iniciaremos en 0.
Segundo, en el script de creacion de salas agregamos código que cambie el valor de Remplazable a 1 en los obj_bloques que forma parte de una sala
[gml]var Inst = instance_create(xcenter*32 + i*32, ycenter*32 + j*32, obj_bloque);
Inst.Remplazable = 1;[/gml]
Tercero, creamos un nuevo script, llamado colocar_puerta, que correra justo despues de generar_laberinto, el script buscara al azar obj_bloques que tengan la variable Remplazable en 1, es decir que sean parte de una sala, y que tengan dos bloques a los costados linealmente, es decir que no sean una esquina. Cuando encuentre un bloque que cumpla ambas condiciones lo remplazara con un objeto obj_puerta.
[gml]do {
var n = irandom(instance_number(obj_bloque));
var Obj_id = instance_find(obj_bloque,n);
with (Obj_id) {
if Remplazable == 1 {
var De,iz,Ar,Ab;
De = position_meeting(x+32,y,obj_bloque);
Iz = position_meeting(x-32,y,obj_bloque);
Ar = position_meeting(x,y-32,obj_bloque);
Ab = position_meeting(x,y+32,obj_bloque);
if (De == 1 && Iz == 1 && Ar == 0 && Ab == 0) ||
(De == 0 && Iz == 0 && Ar == 1 && Ab == 1){
instance_create(x,y,obj_puerta);
instance_destroy();
}
else {
Remplazable = 0;
}
}
}
}until instance_exists(obj_puerta);[/gml]
Primero, declara una variable en el objeto obj_bloque, la llamaremos Remplazable y la iniciaremos en 0.
Segundo, en el script de creacion de salas agregamos código que cambie el valor de Remplazable a 1 en los obj_bloques que forma parte de una sala
[gml]var Inst = instance_create(xcenter*32 + i*32, ycenter*32 + j*32, obj_bloque);
Inst.Remplazable = 1;[/gml]
Tercero, creamos un nuevo script, llamado colocar_puerta, que correra justo despues de generar_laberinto, el script buscara al azar obj_bloques que tengan la variable Remplazable en 1, es decir que sean parte de una sala, y que tengan dos bloques a los costados linealmente, es decir que no sean una esquina. Cuando encuentre un bloque que cumpla ambas condiciones lo remplazara con un objeto obj_puerta.
[gml]do {
var n = irandom(instance_number(obj_bloque));
var Obj_id = instance_find(obj_bloque,n);
with (Obj_id) {
if Remplazable == 1 {
var De,iz,Ar,Ab;
De = position_meeting(x+32,y,obj_bloque);
Iz = position_meeting(x-32,y,obj_bloque);
Ar = position_meeting(x,y-32,obj_bloque);
Ab = position_meeting(x,y+32,obj_bloque);
if (De == 1 && Iz == 1 && Ar == 0 && Ab == 0) ||
(De == 0 && Iz == 0 && Ar == 1 && Ab == 1){
instance_create(x,y,obj_puerta);
instance_destroy();
}
else {
Remplazable = 0;
}
}
}
}until instance_exists(obj_puerta);[/gml]
66
Preguntas y respuestas / Re:Al dibujar una surface, los alphas no funcionan bien
Octubre 30, 2019, 01:58:40 AM
Ese es el comportamiento normal de las surfaces, para arreglarlo desactiva el canal alpha con draw_set_colour_write_enable cuando vayas a dibujar sprites con transparencia, o si necesitas partes de la surface que no sean completamente opacas ni completamente transparentes premultiplica el alpha del sprite y dibuja usando el blend mode extendido con bm_one como origen y bm_inv_src_alpha como destino.
67
Preguntas y respuestas / Re:Mejor manera de crear fondos?
Mayo 09, 2019, 06:16:33 AM
Se agregan desde la lista de capas en el editor de rooms:

68
Preguntas y respuestas / Re:Mejor manera de crear fondos?
Mayo 07, 2019, 05:50:36 AM
GMS 2 utiliza un sistema distinto al de GMS 1 para los tiles, es más eficiente pero más rígido, no se pueden colocar tiles desalineados con la grilla, y la grilla es automáticamente del tamaño de los tiles.
Para colocar tiles "desalineados" hay que usar otros métodos, por ejemplo, se puede usar otra capa para tiles ligeramente movida:

Pero esa es, en mi opinión, una solución de poco uso practico ya que afecta todos los tiles en la capa, una mejor alternativa seria cambiar el tamaño esperado de los tiles a la mitad, un cuarto o inclusive menos del tamaño real, y utilizar tiles en grupo o, mejor aún, pinceles para colocar los tiles en el room:


Finalmente, esta la opción de colocar sprites, sin objeto asociado, en una capa de recursos. Los sprites se comportan de la manera que se comportaban los tiles en GMS 1, al mantener presionado control mientras se colocan se puede ignorar la grilla, y la grilla se puede cambiar de tamaño:

Para colocar tiles "desalineados" hay que usar otros métodos, por ejemplo, se puede usar otra capa para tiles ligeramente movida:

Pero esa es, en mi opinión, una solución de poco uso practico ya que afecta todos los tiles en la capa, una mejor alternativa seria cambiar el tamaño esperado de los tiles a la mitad, un cuarto o inclusive menos del tamaño real, y utilizar tiles en grupo o, mejor aún, pinceles para colocar los tiles en el room:


Finalmente, esta la opción de colocar sprites, sin objeto asociado, en una capa de recursos. Los sprites se comportan de la manera que se comportaban los tiles en GMS 1, al mantener presionado control mientras se colocan se puede ignorar la grilla, y la grilla se puede cambiar de tamaño:

69
Preguntas y respuestas / Re:Problema con arbol de dialogo en GML
Abril 15, 2019, 11:02:52 AM
El código esta un tanto enredado, veo variables sin un uso especifico, pero voy a asumir que son variables que tendrán un uso a futuro.
Para cambiar el texto dibujado debes cambiar el valor de la variable Mensaje, el lugar para hacerlo seria en tu código para la tecla A.
El código que tienes ahí en ese momento destruye la instancia dibujando el mensaje sin importar que opción se elija, puedes cambiarlo de manera que en su lugar cambie el Mensaje según la opción, por ejemplo:
[gml]PULSACIÓN TECLA A
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habría de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}[/gml]
Ahora bien, el problema con dejarlo así seria que ahora no tienes como eliminar el mensaje, yo recomendaría usar una variable para guardar la posición en el árbol de dialogo en la que estas, de manera que la Tecla A avance el dialogo y lo destruya si se encuentra al final.
Entonces agregaríamos la variable al evento create:
[gml]EVENT CREATE
///MENSAJE
alarm[1] = 140
object_set_visible (obj_mensaje, false);
//mensaje base
Mensaje[0] = "Ey, ¿ Que hace alguien como tú por aquí ?";
Mensaje2[0] = "Pregunta 2";
NPC = "???";
Icono = Icon_Mickael;
Dialogo_Pos = 0;[/gml]
Y cambiamos el evento de Tecla A para que tenga en cuenta dicha variable:
[gml]PULSACIÓN TECLA A
if Dialogo_Pos == 0 {
Dialogo_Pos++;
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habría de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}
}
else if Dialogo_Pos == 1 instance_destroy();[/gml]
Con eso ademas podrás poner más mensajes si así lo quieres:
[gml]PULSACIÓN TECLA A
if Dialogo_Pos == 0 {
Dialogo_Pos++;
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habría de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}
}
else if Dialogo_Pos == 1 {
Mensaje = "No confío en los forasteros.";
Dialogo_Pos++
}
else if Dialogo_Pos == 2 instance_destroy();[/gml]
Otra cosa que que tal vez quieras es que las opciones se dejen de dibujar una vez que hayas elegido una respuesta, en ese caso usaríamos una variable de control para determinar cuando se dibujan.
Agregamos la variable en el evento create:
[gml]///MENSAJE
alarm[1] = 140
object_set_visible (obj_mensaje, false);
//mensaje base
Mensaje[0] = "Ey, ¿ Que hace alguien como tú por aquí ?";
Mensaje2[0] = "Pregunta 2";
NPC = "???";
Icono = Icon_Mickael;
Dialogo_Pos = 0;
Mostrar_Opciones = 1;[/gml]
Cambiamos el valor de la variable cuando elegimos una opción:
[gml]PULSACIÓN TECLA A
if Dialogo_Pos == 0 {
Dialogo_Pos++;
Mostrar_Opciones = 0;
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habria de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}
}
else if Dialogo_Pos == 1 {
Mensaje = "No confío en los forasteros";
Dialogo_Pos++
}
else if Dialogo_Pos == 2 instance_destroy();[/gml]
Y agregamos la condición al evento Draw para que solo dibuje las opciones cuando queremos:
[gml]///ELECCIONES
if Mostrar_Opciones == 1 {
var i = 0;
draw_set_font(Dialogo);
draw_set_halign(fa_center);
draw_set_color(c_black);
repeat(buttons) {
draw_set_color(c_black);
if (menu_index == i) draw_set_color(c_blue);
draw_text(menu_x, menu_y + button_h * i, button)
i++;
}
}[/gml]
Para cambiar el texto dibujado debes cambiar el valor de la variable Mensaje, el lugar para hacerlo seria en tu código para la tecla A.
El código que tienes ahí en ese momento destruye la instancia dibujando el mensaje sin importar que opción se elija, puedes cambiarlo de manera que en su lugar cambie el Mensaje según la opción, por ejemplo:
[gml]PULSACIÓN TECLA A
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habría de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}[/gml]
Ahora bien, el problema con dejarlo así seria que ahora no tienes como eliminar el mensaje, yo recomendaría usar una variable para guardar la posición en el árbol de dialogo en la que estas, de manera que la Tecla A avance el dialogo y lo destruya si se encuentra al final.
Entonces agregaríamos la variable al evento create:
[gml]EVENT CREATE
///MENSAJE
alarm[1] = 140
object_set_visible (obj_mensaje, false);
//mensaje base
Mensaje[0] = "Ey, ¿ Que hace alguien como tú por aquí ?";
Mensaje2[0] = "Pregunta 2";
NPC = "???";
Icono = Icon_Mickael;
Dialogo_Pos = 0;[/gml]
Y cambiamos el evento de Tecla A para que tenga en cuenta dicha variable:
[gml]PULSACIÓN TECLA A
if Dialogo_Pos == 0 {
Dialogo_Pos++;
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habría de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}
}
else if Dialogo_Pos == 1 instance_destroy();[/gml]
Con eso ademas podrás poner más mensajes si así lo quieres:
[gml]PULSACIÓN TECLA A
if Dialogo_Pos == 0 {
Dialogo_Pos++;
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habría de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}
}
else if Dialogo_Pos == 1 {
Mensaje = "No confío en los forasteros.";
Dialogo_Pos++
}
else if Dialogo_Pos == 2 instance_destroy();[/gml]
Otra cosa que que tal vez quieras es que las opciones se dejen de dibujar una vez que hayas elegido una respuesta, en ese caso usaríamos una variable de control para determinar cuando se dibujan.
Agregamos la variable en el evento create:
[gml]///MENSAJE
alarm[1] = 140
object_set_visible (obj_mensaje, false);
//mensaje base
Mensaje[0] = "Ey, ¿ Que hace alguien como tú por aquí ?";
Mensaje2[0] = "Pregunta 2";
NPC = "???";
Icono = Icon_Mickael;
Dialogo_Pos = 0;
Mostrar_Opciones = 1;[/gml]
Cambiamos el valor de la variable cuando elegimos una opción:
[gml]PULSACIÓN TECLA A
if Dialogo_Pos == 0 {
Dialogo_Pos++;
Mostrar_Opciones = 0;
switch(menu_index) {
case 2:
Mensaje = "No tienes nada que decir?";
break;
case 1:
Mensaje = "Y por que habria de saberlo?";
break;
case 0:
Mensaje = "Estas perdido?";
break;
}
}
else if Dialogo_Pos == 1 {
Mensaje = "No confío en los forasteros";
Dialogo_Pos++
}
else if Dialogo_Pos == 2 instance_destroy();[/gml]
Y agregamos la condición al evento Draw para que solo dibuje las opciones cuando queremos:
[gml]///ELECCIONES
if Mostrar_Opciones == 1 {
var i = 0;
draw_set_font(Dialogo);
draw_set_halign(fa_center);
draw_set_color(c_black);
repeat(buttons) {
draw_set_color(c_black);
if (menu_index == i) draw_set_color(c_blue);
draw_text(menu_x, menu_y + button_h * i, button)
i++;
}
}[/gml]
70
Preguntas y respuestas / Re:Traduccion con fuentes
Mayo 25, 2018, 03:04:47 AM
Suena a fuga de memoria, en tu script scr_traducido, por ejemplo, veo que usas font_add, y llamas ese script en un evento draw, eso quiere decir que, a menos de que estés limpiando las fuentes con código que no mostraste, por cada step que pasa estas creando una fuente nueva sin eliminar la anterior. Exceptuando para arrays, GMS no tiene recolector de basura, así que esas fuentes se quedan flotando en el limbo y saturando la memoria.
71
Preguntas y respuestas / Re:Traduccion con fuentes
Mayo 21, 2018, 02:39:16 AM
Probando con Hind Medium no tengo ningún problema, el texto se dibuja como debería:

Si dices que te esta pasando con varias fuentes entonces podría tratarse de un problema de incompatibilidad, quizás GM no esta juntando los caracteres apropiadamente, asegurate de tener la ultima versión de GMS, si no la tienes actualiza, y crea un respaldo de cualquier proyecto ANTES de abrirlo con la nueva versión.
Si ya tienes la ultima versión, o si al actualizar no se soluciona el problema, entonces no sé cual pueda ser el error, tocaría ponerse en contacto con el soporte de Yoyo.

Si dices que te esta pasando con varias fuentes entonces podría tratarse de un problema de incompatibilidad, quizás GM no esta juntando los caracteres apropiadamente, asegurate de tener la ultima versión de GMS, si no la tienes actualiza, y crea un respaldo de cualquier proyecto ANTES de abrirlo con la nueva versión.
Si ya tienes la ultima versión, o si al actualizar no se soluciona el problema, entonces no sé cual pueda ser el error, tocaría ponerse en contacto con el soporte de Yoyo.
72
Preguntas y respuestas / Re:Traduccion con fuentes
Mayo 15, 2018, 11:14:21 PM
También uso FontForge, para encontrar la posición de un carácter puedes ir al menú Ver y usar la opción Ir a, o usar el atajo ctrl+alt+>, en la ventana que abre escribes o pegas el carácter y el programa te lleva a la posición que debería tener dentro de la fuente. Alternativamente, si colocas los caracteres en el rango de una fuente en GMS te dará sus posiciones, pero si hay varios seguidos los dará en secuencia, lo que puede ser algo molesto.
Sobre donde sacar fuentes fiables, no conozco de ningún lugar seguro, siempre dependerá del autor de la fuente que tanto esfuerzo le haya puesto, y si hablamos de fuentes gratuitas es difícil encontrar trabajos completos. Es cuestión de usar san google y esperar tener suerte, por ejemplo, para ver los caracteres chinos que querías dibujar use SimSun, que de acuerdo a un articulo explicando las complicaciones de hacer una fuente china para computadoras es una fuente que fue agregada a Windows XP de uso generalizado en China. Asumí que si era lo suficientemente buena para China sería lo suficientemente buena lo que buscaba.
Sobre hindi, en general las fuentes que se encuentran remplazan el alfabeto latino por el alfabeto devanagari, es por eso que si tratas de usar el valor Unicode de una letra devanagari solo consigues un espacio en blanco, pero si usas letras latinas aparece devanagari.
Lo que necesitas es una fuente que use ambos alfabetos, por ejemplo en fonts.google.com encontré Hind, una fuente de código abierto que tiene el alfabeto latino y devanagari en sus respectivas posiciones Unicode.
Sobre donde sacar fuentes fiables, no conozco de ningún lugar seguro, siempre dependerá del autor de la fuente que tanto esfuerzo le haya puesto, y si hablamos de fuentes gratuitas es difícil encontrar trabajos completos. Es cuestión de usar san google y esperar tener suerte, por ejemplo, para ver los caracteres chinos que querías dibujar use SimSun, que de acuerdo a un articulo explicando las complicaciones de hacer una fuente china para computadoras es una fuente que fue agregada a Windows XP de uso generalizado en China. Asumí que si era lo suficientemente buena para China sería lo suficientemente buena lo que buscaba.
Sobre hindi, en general las fuentes que se encuentran remplazan el alfabeto latino por el alfabeto devanagari, es por eso que si tratas de usar el valor Unicode de una letra devanagari solo consigues un espacio en blanco, pero si usas letras latinas aparece devanagari.
Lo que necesitas es una fuente que use ambos alfabetos, por ejemplo en fonts.google.com encontré Hind, una fuente de código abierto que tiene el alfabeto latino y devanagari en sus respectivas posiciones Unicode.
73
Preguntas y respuestas / Re:Traduccion con fuentes
Mayo 15, 2018, 02:04:05 AM
Descargue la fuente que estas usando, o al menos la que google encontró al buscar con ese nombre, y la fuente no tiene glifos para los caracteres que ocupas, los caracteres 32487,32493,28216 y 25103 están en blanco.
Que te aparezcan en show_message o en la ventana de creación de fuente no importa, eso es dibujado por windows y si la fuente usada no tiene los glifos requeridos windows usa fuentes alternativas que si los tengan para mostrarlos.
Al probar con una fuente más completa el texto es dibujado sin problema.
Que te aparezcan en show_message o en la ventana de creación de fuente no importa, eso es dibujado por windows y si la fuente usada no tiene los glifos requeridos windows usa fuentes alternativas que si los tengan para mostrarlos.
Al probar con una fuente más completa el texto es dibujado sin problema.
74
Preguntas y respuestas / Re:Elegir una instancia aleatoria al iniciar la partida
Marzo 23, 2018, 12:47:35 AM
GM usa semillas para las llamadas random, de manera que son aleatorias pero al mismo tiempo repetibles, si quieres usar autentica aleatoriedad usa randomize() antes de tu código. La función randomize() elije una semilla al azar de manera que los resultados de las llamadas random después de la función son virtualmente irrepetibles.
75
Preguntas y respuestas / Re:No inicia Game Maker Studio 1.4
Marzo 09, 2018, 04:21:59 AM
Corrijanme si me equivoco pero me parece que GMS 1 usa DirectX 9, el que usa DirectX 11 es el GMS 2.