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!.

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Void

Páginas: 1 2 3 ... 5
1
Preguntas y respuestas / Re: script GM1 a GM2?
« en: Junio 23, 2022, 12:02:28 am »
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;
    }
}

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
Preguntas y respuestas / Re: Diferencias entre Windows y Windows(YYC)?
« en: Abril 09, 2022, 01:33:47 am »
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
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« 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.

4
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« 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.

5
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« 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;

6
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 31, 2022, 11:35:42 pm »
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:

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;

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.

7
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 31, 2022, 10:09:32 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:

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[i];
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:

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[i];
    c++;
}
return temp_array;
Tambien tengo un error al escribir el comando "coge (objeto)" en una room donde no hay objetos:
DoSet :: Invalid comparison type
 at gml_Script_array_find (line 3) -     if argument0[i] == argument1 return i;

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] = "".

8
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 31, 2022, 09:44:20 pm »
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í:

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[i];
    c++;
}
return temp_array;

9
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 31, 2022, 08:05:50 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í:

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"

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í:

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

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:

cogeobjeto("linterna")

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.

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[i]) && global.invpj[i]!="" {
        Temp_Array[c] = global.invpj[i];
        c++;
    }
}

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

10
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 31, 2022, 02:39:29 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.

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.

Ahora me da error al coger un objeto me da error en array_delete:
Push :: Execution Error - Variable Get -7.temp_array(100008, -2147483648)
 at gml_Script_array_delete (line 9) - return temp_array;

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.

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.

11
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 30, 2022, 11:56:18 pm »
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.

12
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 30, 2022, 11:18:57 pm »
Temp_Array se declara en el script, no en el objeto, deberia quedar así:

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[i]) && obj_inventario_room.inv[i]!="" {
        Temp_Array[c] = obj_inventario_room.inv[i];
        c++;
    }
}

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

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í:

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);

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:

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

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

///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[i];
    c++;
}
return temp_array;

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

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

13
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 30, 2022, 09:01:16 pm »
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.

var Length = array_length_1d(obj_inventario_room.inv),
    String = "",
    Temp_Array[0] = "",
    c = 0;
   
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.

14
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 30, 2022, 07:58:13 pm »
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:

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[i]) && obj_inventario_room.inv[i]!="" {
        Temp_Array[c] = obj_inventario_room.inv[i];
        c++;
    }
}

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

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:

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

///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[i];
    c++;
}
return temp_array;

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

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:

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"

Si quieres dejar un item:

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"

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


15
Preguntas y respuestas / Re: Detectar y memorizar objetos en cada room
« en: Marzo 30, 2022, 12:38:01 am »
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:

inv[0] = 0

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:

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

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.

Páginas: 1 2 3 ... 5