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 - Void

16
El ejemplo que hice justo mostraba como hacer eso. Bueno, al menos la parte de examinar los items en cada room. Pero ya que no puedes verlo, la idea es esta:

Crea un objeto llamado obj_inventario_room, en su evento create crea un array llamado inv:

[gml]inv[0] = 0[/gml]

Ahora, en el Creation Code de cada room crea una instancia de obj_inventario_room, y agregale a su array los items que hay originalmente en la room, por ejemplo:

[gml]var Inst = instance_create(0,0,obj_inventario_room);
with Inst {
    inv[0] = "linterna";
   inv[1] = "pedernal";
}[/gml]

Para ver que items hay en el room se usa el mismo código que para ver el inventario del jugador, pero viendo al array en obj_inventario_room.

Para tomar un item de la room se busca si hay espacio en el inventario del jugador y si lo hay se elimina del array de obj_inventario_room y se agrega al array del jugador.

Para dejar un item se elimina del array del jugador y se agrega al array de obj_inventario_room.

Aunque un room no tenga items inicialmente debe tener una instancia de obj_inventario_room. Los rooms deben ser persistentes.

Siguiendo esas reglas se puede usar código que funcionará en cualquier room.
17
Si dibujas un texto dentro de un if solo se dibujara mientras el if sea cierto, en este caso tu if checka si enter fue presionado, y eso solo sera cierto en el step en que fue presionado. Si quieres que el texto permanesca en la pantalla debe dibujarse fuera de ese if.

Pero tambien cometi un error con el código que te pase en el post anterior, la variable String en el evento Draw no puede ser local, necesita ser una variable de instancia iniciada desde el evento create.

Para lo que quieres hacer, pon en un script este código basado en el que te pase antes:

[gml]var Length = array_length_1d(global.invpj),
    String = "",
    Temp_Array,
    c = 0;

for (var i=0;i<Length;++i){
    if is_string(global.invpj) && global.invpj!="" {
        Temp_Array[c] = global.invpj;
        c++;
    }
}

Length = array_length_1d(Temp_Array);
for(var i = 0; i < Length; ++i){
    String += Temp_Array;
    if i == Length-2 String += " y ";
    else if i < Length-2 String += ", ";
}
return String [/gml]

Llama el script mirar_inventario o algo así.

Luego cambia tu código de manera que dentro del if se cambie la variable String según lo que quieras escribir, y se dibuje fuera de él. Usa el script que acabas de crear para adquirir la lista de items.

[gml]draw_set_color(c_lime);
draw_set_font(Fpantalla);
draw_text(550,950,"[Consola]> "+keyboard_string + cursor);

if keyboard_check_pressed(vk_enter){
    Unlock = keyboard_string
    if Unlock == "mirar"{
    String = ">Correcto#";
    String += "Veo " + mirar_inventario();
}else{
    String = ">No comprendo";
    }keyboard_string = "";
}
draw_text(550,900,String)[/gml]

Recuerda declarar String en el evento create como una cadena vacia

[gml]String = ""[/gml]

Cuando quieras borrar el texto dibujado simplemente vuelve a cambiar String a una cadena vacia.
18
Cita de: JohnW en Marzo 29, 2022, 02:49:07 PM
No me deja abrir el archivo, me sale el error de steam.
El ejemplo fue hecho en la ultima version de GMS1, v1.4.9999. Si estas usando una versión anterior probablemente no podrás verlo, pero no se cual es el error de steam al que te refieres.

Cita de: JohnW en Marzo 29, 2022, 02:49:07 PM
Con esto me surgen 2 problemas... el primero es que me salta el error:
[gml]Push :: Execution Error - Variable Get 100002.i(100029, -2147483648)
at gml_Object_inputBox_DrawEvent_1 (line 7) -     draw_text(32,100,global.invpj);[/gml]

Se ve que no puede entrar a la lista "array" a leerme esos objetos igual que hace el boton mirar.
Y el segundo error que tengo, es que al escribir algo... el mensaje por ejemplo "No comprendo" Me sale por pantalla pero al segundo se borra... cuando tendria que permanecer en pantalla hasta que cambies de room a otra.

El primer error te sale porque la variable i  en global.invpj no ha sido definida, cambiala por un número o agrega un bucle for que pase por los elementos del array.

El segundo problema es que el estas dibujando el texto dentro del if keyboard_check_pressed, asi que solo se dibujara durante el step en que presiones la tecla, agrega un variable que mantenga el texto a escribir y dibuja el texto fuera del if.

[gml]var String = "";

if keyboard_check_pressed(vk_enter){
    Unlock = keyboard_string
    if Unlock == "mirar"{
    String = string(global.invpj[0]);
}else{
    String = "No comprendo";
    }keyboard_string = "";
}
draw_text(32,100,String)[/gml]

Cita de: JohnW en Marzo 29, 2022, 04:49:36 PM
Aunque me dado cuenta que si primero pulso el boton "mirar" y luego escribo en el inputtext "mirar" Si que me ejecuta el script, pero si no pulso el boton y escribo de primeras "mirar" no me carga nada.
Lo unico que se me ocurre acá es que hayas copiado el código completo, incluyendo el if activo == 1, si solo cambias activo a 1 cuando le haces click al boton entonces el script solo funcionará despues de que hayas hecho click, o cambias esa parte o haces que activo tambien cambie a 1 cuando escribes "mirar."
19
Para que se deje de mostrar el texto cambia la variable activo de nuevo a 0.

El Creation Code de un room no es un buen lugar para controlar que items hay en un room, si el room no es persistente entonces se ejecutará cada vez que entres al room, lo que significa que aún si ya tomaste el item de un room cuando vuelvas lo volverá a generar. Y si el room es persistente el código se ejecutara una sola vez cuando entres al room por primera vez, así que no podrás controlar cambios como dejar otro objeto en el room.

De verdad te sugiero que uses objetos para controlar que items hay en cada room, puedes usar un único objeto que sea populado desde el Creation Code de un room persistente, de esta manera puedes accesar su contenido mientras estas en el room, cualquier cambio que se realize en su lista de items se mantendrá cuando salgas y vuelvas al room y cada room tendrá una lista de items propia.

Te dejo un pequeño ejemplo.
20
Ese es el formato del string de los arrays, para mostrarlo de la manera que quieres deberias generar una string propia a tu gusto.

Para hacerlo primero tenemos que saber el tamaño del array, tener una string vacia, un array temporal y un contador para dicho array. Vamos a pasar el array del inventario al array temporal, exceptuando los espacios vacios:

[gml]if activo == 1 {
   var Length = array_length_1d(global.invpj),
      String = "",
      Temp_Array,
      c = 0;

   for (var i=0;i<Length;++i){
      if is_string(global.invpj) && global.invpj!="" {
         Temp_Array[c] = global.invpj;
         c++;
      }
   }
}[/gml]
Ahora tomamos el tamaño del array temporal y creamos la string agregando cada elemento del array, y los separamos con una y si es el penultimo elemento, o una coma si no.

[gml]if activo == 1 {
   var Length = array_length_1d(global.invpj),
      String = "",
      Temp_Array,
      c = 0;

   for (var i=0;i<Length;++i){
      if is_string(global.invpj) && global.invpj!="" {
         Temp_Array[c] = global.invpj;
         c++;
      }
   }

   Length = array_length_1d(Temp_Array);
   for(var i = 0; i < Length; ++i){
      String += Temp_Array;
      if i == Length-2 String += " y ";
      else if i < Length-2 String += ", ";
   }

   draw_text(32,32,"Tengo " + String);
}[/gml]
Con eso el texto se varia de esta forma:

CitarTengo linterna, pedernal, anillo y espada

Para tu pregunta original, pienso que lo mejor sería tener variables que indiquen donde estan los objetos, cada vez que presiones examinar checar si el objeto esta en la misma room que tu y mencionarlo si es así. Con eso dicho, es perfectamente posible usar objetos aunque estos no se dibujen en el room, podrias usar rooms permanentes, cuando tomas un objeto lo eliminas, y cuando de lo dejas lo creas en la room nueva, asi cuando presionas examinar te fijas si los objetos existen en la room o no.
21
https://manual-es.yoyogames.com/GameMaker_Language/GML_Reference/General_Game_Control/game_restart.htm

La función game_restart no reinicia el juego de 0, varios elementos se mantienen entre reinicios. Si vas a utilizarla es importante saber que se mantiene para limpiarlo manualmente.
22
La suscripción solo afecta la capacidad de exportar, no lo que ya ha sido exportado. En tu caso hipotético no importa si la suscripción se venció tu juego puede quedarse en la tienda de Android.
23
En ese caso, en tanto la licencia haya sido adquirida legalmente puedes publicar lo que quieras bajo las condiciones que quieras.
24
La licencia gratuita de GMS 2 solo permite exportar a Opera GX, para poder exportar a Windows se necesita tener una licencia permanente o una suscripción. Las licencias permanentes actualmente solo se pueden comprar en Steam, las suscripciones se pueden comprar en el sitio de Yoyo.
25
Usa un switch que transforme el valor en una string, por ejemplo:

function name_key(key) {
//Teclas Especiales
switch(key){
case(vk_left): return "Izquierda"; break;
case(vk_right): return "Derecha"; break;
case(vk_up): return "Arriba"; break;
case(vk_down): return "Abajo"; break;
}
//Teclas de números y letras
var Tecla = string_upper(chr(key));
if !string_pos(Key,"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") Key = "Desconocida";
if argument0 == -1 return "-No Tecla-";
return "Tecla " + Tecla;
}


Esta función regresa el nombre de las teclas direccionales y alfanuméricas, cualquier otra tecla aparecería como "Tecla Desconocida", se puede agregar el valor de dichas teclas al switch para ponerles un nombre.
26
Noticias / Re: Opera GX Game Jam
Septiembre 08, 2021, 08:25:01 PM
En el foro oficial mencionaron que hubieron tantos participantes que se vieron forzados a retrasar un poco la seleccion de finalistas para poder darle una cantidad de tiempo justa a cada entrada, tambien se aumento la cantidad de finalistas de 4 a 8, que fueron publicados hoy en el sitio https://www.opera.com/gx/gamejam.
27
Puede usar la función audio_group_set_gain para cambiar el volumen de un grupo predefinido de sonidos.
28
El código debería funcionar para hacer lo que quieres. Alternativamente podrías agregar al evento create del objeto obj_abduct código que elimine el objeto si se están presionando las teclas para moverse:

[gml]if keyboard_check(vk_right) || keyboard_check(vk_left)
{
   instance_destroy ()
}[/gml]

De esta manera el objeto obj_abduct se destruirá antes de que sea dibujado.

Dejo un ejemplo con ambos métodos, el ufo de arriba (rojo) usa el método que te dí en el post anterior, el ufo de abajo (azul) usa el método que explico en este.
29
Si lo que quieres es que el objeto obj_abduct no se cree mientras presionas las teclas de los lados agrega && !keyboard_check(vk_right) && !keyboard_check(vk_left) al if final del step en el objeto obj_ufo:

[gml]if keyboard_check_pressed (vk_space) && !keyboard_check(vk_right) && !keyboard_check(vk_left)
{
    instance_activate_object(obj_abduct)
instance_create_depth (x, y, 64, obj_abduct)
}[/gml]
30
Preguntas y respuestas / Re: Items con descripcion
Junio 26, 2021, 07:43:25 AM
Veamos, primero necesitamos "ver" sobre que esta el mouse, afortunadamente tu código ya tiene una parte que hace eso, la sección interaccion de tu código en el Draw del objeto obj_inventario, en esa parte vamos a agregar un if para determinar si el slot sobre el que esta el mouse esta vacio:

[gml]if slot != 0 {
   //Acá el resto del código
   }[/gml]

Vamos a necesitar dos nuevas funciones, una para adquirir el nombre del item, otra para adquirir su descripcion, las llamaremos apropiadamente scr_get_item_name y scr_get_item_description, y lo que harán es simple, se les pasa el número de item y las funciones devuelven una string dependiendo de dicho valor:

[gml]function scr_get_item_name(item){
   
   switch(item){
      case(1): return "Poción de Salud";
      case(2): return "Poción de Maná";
      case(3): return "Espada de Hierro";
      case(4): return "Pico de Hierro";
   }

}

function scr_get_item_description(item){
   
   switch(item){
      case(1): return "Brebaje que sana la salud de quien lo bebá";
      case(2): return "Brebaje que recupera la energía mágica de quien lo bebá";
      case(3): return "Espada común hecha de hierro";
      case(4): return "Pico común hecho de hierro";
   }

}[/gml]

La string se puede cambiar por lo que tu quieras, y para agregar nuevos items se debe seguir el patrón que ves en la función, por ejemplo "case(5): return "Manzana";".

Por cierto, necesitarás agregar una nueva fuente para poder dibujar acentos, la fuente que usa el GM por defecto no los tiene, simplemente crea una fuente nueva, abajo veras una opción llamada "Add" (si estas usando la IDE en inglés), le daz click allí, seleccionas "ASCII" y "Add Range" y listo.

Volviendo al tema, ahora que tienes las funciones que regresan el texto a dibujar, ahora solo es cuestión de dibujarlo. Empezamos por cambiar la fuente a la que acabamos de crear con la función draw_set_font, adquirimos el nombre del item y la descripción y calculamos la altura de estas strings usando string_height y string_height_ext:

[gml]if slot != 0 {
   draw_set_font(Font1)
   var _name = scr_get_item_name(slot),
      _description = scr_get_item_description(slot),
      _height = (string_height(_name)+string_height_ext(_description,-1,200))*0.25+6;
      
   //Acá el resto del código
}[/gml]

Usamos string_height_ext porque esa función calcula la altura de strings que han sido divididas en varios reglones debido a su largo, en este caso la división ocurre cuando la string supera 200 pixeles de largo. También notaras que estamos multiplicando por 0.25 y sumando 6, 0.25 es la escala a la que dibujaremos las strings, y el 6 es simplemente un poco de espacio extra.

Ahora que tenemos todas las variables necesarias podemos finalmente dibujar, empezamos por dibujar el cuadro donde aparece el texto:

[gml]draw_set_color(c_white)
draw_rectangle(vx+80,vy+2,vx+150,vy+_height,0)
draw_set_colour(c_black)
draw_rectangle(vx+80,vy+2,vx+150,vy+_height,1)[/gml]

Esta parte es simple, se dibujan dos rectángulos, primero uno blanco relleno, luego otro negro sin rellenar, es decir solo la silueta. Notarás que usamos la variable _height donde guardamos la altura de las strings a dibujar, esto hará que el tamaño final del cuadro cambie según el tamaño de las strings, el resto de los valores se consiguieron con un poco de prueba y error, se podrían conseguir matemáticamente pero mejor no complicarnos por el momento.

Ahora que tenemos el cuadro solo falta dibujar el texto, usamos draw_text_transformed que permite cambiar la escala del texto, que para este caso sera 0.25, primero ponemos el nombre del item y luego la descripción, para la descripcion usamos draw_text_ext_transformed que tambíen nos permitira separar la string a un nuevo reglon si supera un largo especifico, en este caso 200 pixeles:

[gml]draw_text_transformed(vx+90,vy+4,_name,0.25,0.25,0)
draw_text_ext_transformed(vx+90,vy+10,_description,-1,200,0.25,0.25,0)[/gml]

Y eso es todo, todo junto queda así:

[gml]if slot != 0 {
   draw_set_font(Font1)
   var _name = scr_get_item_name(slot),
      _description = scr_get_item_description(slot),
      _height = (string_height(_name)+string_height_ext(_description,-1,200))*0.25+6;

   draw_set_color(c_white)
   draw_rectangle(vx+80,vy+2,vx+150,vy+_height,0)
   draw_set_colour(c_black)
   draw_rectangle(vx+80,vy+2,vx+150,vy+_height,1)
   draw_text_transformed(vx+90,vy+4,_name,0.25,0.25,0)
   draw_text_ext_transformed(vx+90,vy+10,_description,-1,200,0.25,0.25,0)
}[/gml]


Como nota final, muchos de los valores estaticos que vez en el código se consiguieron a punta de prueba y error hasta que se consiguio una apariencia aceptable, así que si prefieres otra apariencia puedes ponerte a probar cambiandolos hasta que este a tu preferencia.

Dejo el editable del otro tema con los cambios de este: