Noticias

¡Ayuda a la Comunidad GM, haz una donación!

* 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: Detectar y memorizar objetos en cada room  (Leído 1460 veces)

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

Desconectado JohnW

Respuesta #30 en: Marzo 31, 2022, 11:49:26 pm
Genial!! Ahora si funciona, me daba un error de argumentos en el array "array find y le añadi de nuevo el argumento del obj_inventario_room:"
array_find(argument0),0,1);
Yo lo agrege de nuevo:
array_find(obj_inventario_room.inv,argument0),1)

Pero me falla este codigo:
var Length = array_length_1d(argument0);
for(var i=0;i<Length;++i){
    if argument0[i] == argument1 return i;
}
return -1;
Dandome el error este:
DoSet :: Invalid comparison type
 at gml_Script_array_find (line 3) -     if argument0[i] == argument1 return i;

Aver si me se explicar en el momento que pasa...

Resulta que te vas a una room donde hay objetos... yo lo he probado en la 4 con 2 objetos. El error ocurre cuando coges esos 2 objetos, los dejas de nuevo en el suelo y de nuevo los vuelves a coger... es justo cuando los coges de nuevo cuando salta ese error.

Igual es porque al coger, dejar y volver a coger los argumentos cambian y no los lee bien?

 


Desconectado Void

Respuesta #31 en: Abril 01, 2022, 12:09:52 am
Lo más seguro es que se este colando un numero al array en algún momento, podrías revisar caso por caso para ver cuando es exactamente que ocurre, o podrías convertir los argumentos a strings para que nunca se comparen enteros a strings:

var Length = array_length_1d(argument0);
for(var i=0;i<Length;++i){
    if string(argument0[i]) == string(argument1) return i;
}
return -1;

 
Los siguientes usuarios dieron las gracias a este tema: JohnW


Desconectado JohnW

Respuesta #32 en: Abril 01, 2022, 12:45:57 am
Perfecto!! Eres un maquina amigo!!

¿Te puedo dar creditos en mi juego poniendo tu nombre o poner alguna referencia tuya como programador?

La verdad me has ayudado muchisimo... y seria un placer que tu nombre apareciera en el juego.

Todo esto me lo estudiare para aprender todo lo que me has enseñado.

Aun queda alguna tonteria por hacer... pero ya no quiero molestarte mas.

Muchisimas gracias otra vez!! Eres un verdadero crack.

 


Desconectado JohnW

Respuesta #33 en: Abril 01, 2022, 01:33:31 am
Una duda mas... he intentado hacer algo por mi cuenta pero no entiendo muy bien como hacerlo.

Queria aprovechar el script "array_find" para buscar un objeto dentro del inventario del PJ y de tenerlo pues activar variables o funciones a parte para interectuar con ellos.

He creado otro script llamado "compruebalinterna":
var Pos = array_find(global.invpj,argument0);
if Pos == argument0 {
    String = "Linterna encendida" global.Elinterna = 1;
}else{
    String = "No tengo " + argument0 + " que pueda encender";
}
Lo que pretendo con eso es que me busque en el inventario global.invpj el argumento0 "en este caso seria la linterna (ya he creado el comando "enciende linterna").
Entonces le dicho al if que si Pos es igual que el argumento0 que estaba buscando que me active la variable de la linterna y en caso contrario me diga que no la tengo.
Pero me tira este error:
Push :: Execution Error - Variable Get 100001.linterna(100010, -2147483648)
 at gml_Script_compruebalinterna (line 1) - var Pos = array_find(global.invpj,linterna);

 


Desconectado Void

Respuesta #34 en: Abril 01, 2022, 02:41:38 am
El script array_find devuelve la posición de dentro del script del valor buscado, es decir, un número. Si no encuentra el valor en ninguna posición devuelve -1, puedes usar eso para saber si tienes un item en inventario:

var Pos = array_find(global.invpj,argument0);
if Pos != -1 {
    String = "Linterna encendida" global.Elinterna = 1;
}else{
    String = "No tengo " + argument0 + " que pueda encender";
}

Sobre créditos no necesitas nombrarme en ninguna manera, pero si igual quieres simplemente con Void esta bien.

 
Los siguientes usuarios dieron las gracias a este tema: JohnW


Desconectado JohnW

Respuesta #35 en: Abril 02, 2022, 06:27:58 pm
Hola de nuevo Void!

Me funciona todo correctamente... con tus enseñanzas he podido lograr nuevas mecanicas en el juego.
Pero me gustaria añadir una pequeña mejora al inputbox y no se hacerla...
Resuta que ahora puedes escribir infinito en la ventana de comandos y quiero poner un minimo de caracteres, por ejemplo 50 caracteres maximos...
¿Se podria hacer esto?
El codigo del inputbox es este:
if keyboard_check_pressed(vk_enter){
    Unlock = keyboard_string;
    switch (Unlock){
        case ("sur"): String = ""; controlsur(); break;
       default: String = "No Comprendo, si necesitas ayuda escribe: ayuda o ayuda comandos"; break;
    }
    keyboard_string = "";
}
draw_text(550,880,String);

 


Desconectado Void

Respuesta #36 en: Abril 03, 2022, 01:37:09 am
Primero medirías el largo de la cadena en keyboard_string con string_length, si es mayor a 50 puedes copiar los primeros 50 caracteres, o borrar los caracteres que se pasen de 50

if string_length(keyboard_string) > 50 {
    //Copia los primeros 50 caracteres
    keyboard_string = string_copy(keyboard_string,1,50);
    //Borra los caracteres después de 50
    keyboard_string = string_delete(keyboard_string,51,10);
}

El código iría antes de cualquier otra mención de keyboard_string y solo necesitas usar uno de los dos, copiar o borrar.

 
Los siguientes usuarios dieron las gracias a este tema: JohnW


Desconectado JohnW

Respuesta #37 en: Abril 03, 2022, 07:02:30 pm
Como siempre Void, muchisimas gracias!
De nuevo vuelves a salvarme.

No se que habria hecho sin toda tu ayuda la verdad.