Loader

Shoutbox

Menú

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.

Menú Mostrar Mensajes

Mensajes - Void

#1
Preguntas y respuestas / Re: script GM1 a GM2?
Junio 23, 2022, 12:02:28 AM
[gml]function nombre_de_funcion(initAngle,numbBullets){
   var bulletAngle = 360/numbBullets;

   for(var i=initAngle; i<initAngle+360;  i+=bulletAngle){
       var thisBullet= instance_create_layer(x, y,"Instances", objBullet);
       thisBullet.sprite_index=sprBull0;
       thisBullet.direction=i;
       thisBullet.speed=2;
   }
}[/gml]

Cambia nombre_de_funcion por el nombre que le quieras poner a la función, y en instance_create_layer cambia "Instances" por la layer en la que quieras crear la instancia.
#2
YYC es más estricto con la sintaxis del código, tarda más en compilar, y cuando tira errores no son tan comprensibles como con VM (el modo normal), a cambio el ejecutable es compilado a lenguaje nativo (para windows compila a C++), lo que lo hace más veloz, que tanto más veloz dependerá de que tan intensos sean los cálculos que tu juego debe hacer, si el aspecto más lento de tu juego son los gráficos entonces el YYC te ayudara poco o nada en ese aspecto.
#3
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

[gml]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);
}[/gml]

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.
#4
Acabo de tratar de subir un juego y no tuve problemas al hacerlo, pero según sé esta semana en yoyo han tenido algunos problemas con 2fa y algunas descargas del sitio no están disponibles, te recomendaría que pruebes de nuevo luego y de igual no poder le escribas al soporte de yoyo.
#5
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:

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

Sobre créditos no necesitas nombrarme en ninguna manera, pero si igual quieres simplemente con Void esta bien.
#6
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:

[gml]var Length = array_length_1d(argument0);
for(var i=0;i<Length;++i){
    if string(argument0) == string(argument1) return i;
}
return -1;[/gml]
#7
De hecho la respuesta a eso es simple, el script cogeobjeto inmediatamente asume que el objeto existe, no se le a agregado ningún chequeo para ver si el objeto efectivamente existe dentro del room:

[gml]var Pos = array_find(obj_invetario_room.inv,argument0);
if Pos == -1 {
   String = "No hay " + argument0 + " que pueda coger";
   exit;
}
Pos = array_find(global.invpj,"")
if  Pos != -1 {
   obj_inventario_room.inv = array_delete(obj_inventario_room.inv,array_find(argument0),0,1);
   global.invpj[Pos] = argument0;
   String = "Cojo " + argument0;
}
else String = "No tengo espacio para coger " + argument0;[/gml]

Con ese chequeo inicial si el objeto no existe dentro del array de obj_inventario_room pone una string apropiada y termina el código antes de ponerse a modificar el inventario del jugador.
#8
Cita de: JohnW en Marzo 31, 2022, 09:52:47 PM
Me habia fijado en eso y probe tambien poner los "||" y tambien probe de poner "or"... pero con esa modificacion me tira este error:

[gml]Push :: Execution Error - Variable Index [0,1] out of range [1,1] - -7.temp_array(100008,1)
at gml_Script_array_delete (line 7) -     temp_array[c] = temp_array;[/gml]
Debo estar ciego, es otro error en el script que hasta ahora noto, temp_array se esta igualando a si mismo, cuando deberia ser a argument0:

[gml]var temp_array,
    Length = array_length_1d(argument0)
    c = 0;
    temp_array[0]="";
for (var i = 0; i<Length;++i){
    if i < argument1 || i > argument1+argument2-1
    temp_array[c] = argument0;
    c++;
}
return temp_array;
[/gml]
Cita de: JohnW en Marzo 31, 2022, 09:52:47 PM
Tambien tengo un error al escribir el comando "coge (objeto)" en una room donde no hay objetos:
[gml]DoSet :: Invalid comparison type
at gml_Script_array_find (line 3) -     if argument0 == argument1 return i;[/gml]

Ah, ese es un error de tipos, tambien error mio, no lo preevi, en el evento create del objeto obj_inventario_room cambia inv[0] = 0 por inv[0] = "".
#9
Ok, ya veo porque ocurre el problema de que borre todos los items. Es en efecto un fallo en ese script, pero no tiene que ver con los argumentos.

El fallo esta en las condiciones, cuando escribí el script cometí un error con las condiciones dentro del for. El script debería crear un array nuevo con el contenido del viejo, saltándose las posiciones que se le indican, de esa manera "borra" esas posiciones, pero la condición que escribí es "si la posición actual es menor y mayor a las posiciones dadas" lo cual es imposible, por lo que siempre devuelve un array vacio, la condición debería haber sido "si la posición actual es menor O mayor a las posiciones dadas."

El script corregido quedaría así:

[gml]var temp_array,
    Length = array_length_1d(argument0)
    c = 0;
    temp_array[0]="";
for (var i = 0; i<Length;++i){
    if i < argument1 || i > argument1+argument2-1
    temp_array[c] = temp_array;
    c++;
}
return temp_array;[/gml]
#10
Cita de: JohnW en Marzo 31, 2022, 04:42:04 PM
No se a que te refieres con el array del obj_inventario_room.inv porque ya esta puesto eso.
El primer argumento de array_find deberia ser un array, en array_find("linterna") solo se le esta pasando una cadena, es ahí donde hay que agregar obj_inventario_room.inv como primer argumento. Deberia quedar así:

[gml]var Pos = array_find(global.invpj,"")
if  Pos != -1 {
obj_inventario_room.inv = array_delete(obj_inventario_room.inv,array_find(obj_inventario_room.inv,"linterna"),1)
global.invpj[Pos] = "linterna"
String = "Cojo " + "linterna"
}
else String = "No tengo espacio para coger " + "linterna"[/gml]

Cita de: JohnW en Marzo 31, 2022, 04:42:04 PM
No se hacer esto, he intentado hacer un script con switch agregando en cada case un objeto y luego pasarle ese script al codigo de coger y dejar objetos pero no me aclaro.

Para pasar datos a un script como argumento simplemente se cambia la parte del script que trabaja con ese dato por la variable argument correspondiente, existen argument0, argument1, argument2 hasta llegar a argument15, y reciben los datos según el orden que se pasan cuando se llama el script, el primer argumento sera argument0, el segundo sera argument1 y así.

Si queremos que a un script se le pueda pasar el nombre de objeto entonces cambiamos el código donde se trabaja con dicho nombre de objeto, en este caso quedaría así:

[gml]var Pos = array_find(global.invpj,"")
if  Pos != -1 {
obj_inventario_room.inv = array_delete(obj_inventario_room.inv,array_find(obj_inventario_room.inv,argument0),1)
global.invpj[Pos] = argument0
String = "Cojo " + argument0
}
else String = "No tengo espacio para coger " + argument0[/gml]

Como notaras, cada vez que el script decia "linterna" lo cambiamos a argument0

Para usar el script lo llamamos pasando el nombre del item, por ejemplo:

[gml]cogeobjeto("linterna")[/gml]

Cita de: JohnW en Marzo 31, 2022, 04:42:04 PM
En un script si me deja inicializar el temp_array como un array vacio pero en otros me da error de escritura y no me deja guardarlo con ese error.
Aporto imagen:
https://ibb.co/rbMQnF8
No declares temp_array como array dentro del area var, el GMS no lo acepta ahí. Para que quedemos claros en esto, la palabra clave var hace que las variables declaradas sean locales, es decir variables temporales que se borrarán despues de que termine el bloque de código. Se pueden declarar varias variables con un solo var si se separan con coma, y un punto y coma señala el final del area del var. Deja temp_array dentro del var y luego declaralo como array despues de su punto y coma.

[gml]var Length = array_length_1d(global.invpj),
    String = "",
    Temp_Array,
    c = 0;
   
Temp_Array[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]
#11
Cita de: JohnW en Marzo 31, 2022, 12:11:28 AM
Entonces para que funcione los comandos "coger objeto" y "dejar objeto" he de copiar los scripts de coger y tantas veces como objetos tenga sustituyendo en cada copia el "nombre del item" por el nombre del objeto, no?
No crees un código adicional por item, en su lugar usa un solo script al que se le pueda pasar el nombre del item como argumento.

Cita de: JohnW en Marzo 31, 2022, 12:11:28 AM
El error que me daba era que faltaba un "1" al lado de linterna xq pedia 2 argumentos y le estabamos dando 1 quedando asi:

No, como te dije, lo que le falta es el nombre del array, obj_inventario_room.inv. No pongas argumentos al azar, solo porque deja de tirar error no significa que esta funcionando. Si tienes que adivinar un argumento estudia el código primero para al menos tener alguna idea de lo que pide.

Cita de: JohnW en Marzo 31, 2022, 12:11:28 AM
Ahora me da error al coger un objeto me da error en array_delete:
[gml]Push :: Execution Error - Variable Get -7.temp_array(100008, -2147483648)
at gml_Script_array_delete (line 9) - return temp_array;
[/gml]

El error que te da con array_delete es el mismo de antes, temp_array debe ser inicializado como un array con una cadena vacía, el problema fue que no anticipe que pasaría con arrays que tienen solo un elemento.

Cita de: JohnW en Marzo 31, 2022, 12:11:28 AM
Y he localizado otro fallo... cuando estoy en una room donde hay mas de 1 objeto... por ejemplo room 4 hay linterna y pedernal... si le dijo coge linterna... desaparece la linterna y el pedernal de la room. No se queda el pedernal.
Sin ver el código me imagino que el problema es que, como dijiste al principio, incluiste más código para el resto de los items en el mismo script, y sin nada que lo detenga el código sigue corriendo para todos los items que encuentre en el room.
#12
El segundo error que te da es porque olvide poner el array en uno de los array_find, simplemente agrégalo como primer argumento.

Y los casos para coje y deja no van a funcionar así, los códigos que deje para coger y dejar eran ejemplos, debes adaptarlos a tus necesidades, específicamente, en el ejemplo uso la cadena "nombre del item" como remplazo para el item que afectar y si tus scripts cogeobjeto y dejaobjeto no toman argumentos no van a saber que con que item están trabajando.
#13
Temp_Array se declara en el script, no en el objeto, deberia quedar así:

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

for (var i=0;i<Length;++i){
    if is_string(obj_inventario_room.inv) && obj_inventario_room.inv!="" {
        Temp_Array[c] = obj_inventario_room.inv;
        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]

La estructura del switch es incorecta, los casos no se definen por numero, sino por el valor que quieres comparar, y los else son exclusivos para if, no puedes usarlos despues de un switch, la versión de else para switch es default, y se utiliza dentro del switch. Aparte en tu código colocaste ese else despues del if para vk_enter, asi que esta constantemente sobrescribiendo el texto a dibujar. Deberia quedar así:

[gml]if keyboard_check_pressed(vk_enter){
    Unlock = keyboard_string;
    switch (Unlock){
        case ("inventario"): String = "Tengo " + mirarinventariopj(); break;
        case ("mirar"): String = "Veo " + mirarinventarioroom(); break;
      default: String = ">No Comprendo"; break;
   }
   keyboard_string = "";
}
draw_text(550,900,String);[/gml]

Finalmente, array_push, array_find y array_delete aparecen como error justamente porque no se han creado scripts con esos nombres.

Crea un script nuevo, nombralo array_push y en su interior pega este código:

[gml]///array_push(array,value)
argument0[array_length_1d(argument0)] = argument1;
return argument0;[/gml]

Crea otro script, nombralo array_delete y en su interior pega este código:

[gml]///array_delete(array,index,number)
var temp_array,
    Length = array_length_1d(argument0)
    c = 0;
for (var i = 0; i<Length;++i){
    if i<argument1 && i > argument1+argument2-1
    temp_array[c] = temp_array;
    c++;
}
return temp_array;[/gml]

Por ultimo, crea otro script, nombralo array_find y en su interior pega este código:

[gml]///array_find(array,value)
var Length = array_length_1d(argument0);
for(var i=0;i<Length;++i){
    if argument0 == argument1 return i;
}
return -1;[/gml]
#14
Ok, el error ocurre porque en los rooms que no tienen objetos Temp_Array nunca se vuelve un array, se puede arreglar declarando Temp_Array como un un array con un elemento vacío desde el inicio.

[gml]var Length = array_length_1d(obj_inventario_room.inv),
    String = "",
    Temp_Array[0] = "",
    c = 0;[/gml]
   
El comando inventario deja de funcionar porque el else de mirar lo esta sobrescribiendo, has que mirar también sea un else de inventario o cámbialo todo a un switch.

Y si, como te dije, las funciones array_push, array_delete y array_find no existen en GMS 1, tienes que crear scripts con los códigos que te pase y darles esos nombres.
#15
El error te sale porque estas buscando el array inv del objeto que llama el script, no del objeto obj_inventario_room. Cambia el código del script de esta manera:

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

for (var i=0;i<Length;++i){
    if is_string(obj_inventario_room.inv) && obj_inventario_room.inv!="" {
        Temp_Array[c] = obj_inventario_room.inv;
        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]

Con eso el script buscará dentro del obj_invetario_room.

Ahora, para mover items entre inventarios, GMS 1 no tiene las funciones array_delete y array_push, estas fueron introducidas en GMS 2.3. Acá dejo scripts equivalentes:

[gml]///array_push(array,value)
argument0[array_length_1d(argument0)] = argument1;
return argument0;[/gml]

[gml]///array_delete(array,index,number)
var temp_array,
    Length = array_length_1d(argument0)
    c = 0;
for (var i = 0; i<Length;++i){
    if i<argument1 && i > argument1+argument2-1
    temp_array[c] = temp_array;
    c++;
}
return temp_array;[/gml]

[gml]///array_find(array,value)
var Length = array_length_1d(argument0);
for(var i=0;i<Length;++i){
    if argument0 == argument1 return i;
}
return -1;[/gml]

Vas a usar array_find para encontrar si un elemento existe dentro de un array y obtener su posición. Tambien puedes usarlo para saber si hay espacio dentro del inventario del jugador.

Por ejemplo, si quieres tomar un item:

[gml]var Pos = array_find(global.invpj,"")
if  Pos != -1 {
obj_inventario_room.inv = array_delete(obj_inventario_room.inv,array_find("Nombre del item"),1)
global.invpj[Pos] = "Nombre del item"
String = "Tomas " + "Nombre del item"
}
else String = "No tengo espacio para tomar " + "nombre del item"[/gml]

Si quieres dejar un item:

[gml]var Pos = array_find(global.invpj,"Nombre del item")
if  Pos != -1 {
obj_inventario_room.inv = array_push(obj_inventario_room.inv,"Nombre del item")
global.invpj[Pos] = ""
String = "Dejas " + "Nombre del item"
}
else String = "No tengo " + "nombre del item"[/gml]

Recuerda, cuando quieras referenciar el inventario del room, tienes que usar obj_inventario_room.inv, solo inv te va a dar error.

Powered by EzPortal