Noticias

Importante: ¡Si quieres publicar tu juego no olvides leer este tema!

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

Páginas: 1 2
1
Preguntas y respuestas / Re:Duda con los audio emitters
« en: Noviembre 11, 2019, 04:10:51 pm »
Para eliminar todos de golpe necesitas hacer tu script personalizado para borrar todos y cada uno de los emisores creados. Los cuales, antes debieran listarse dentro de, valga la redundancia, una lista. Esto para tener el registro de todos los emisores que se hayan creado.
Lo más práctico es utilizar las ds_list, porque crecen automáticamente, y se puede utilizar para recorrer enteramente la lista.

Primero deberías crear un script, que haga 2 cosas:
1) crear la lista si no existe.
2) crear un emisor y guardarlo en la lista.
3) devolver el emisor creado.
Puedes llamarlo simplemente crear_emisor_de_sonido();
Lo ideal sería crear una variable global antes para que obtenga el ID de la ds_list, dentro del script:
Luego, operas normalmente:
ae=crear_emisor_de_sonido()
audio_emitter_position(ae,x,y,0)

o:
audio_play_sound_on(ae,explota,0,1)

Luego creas el escript para borrar todos los emisores, el cual debería trabajar así:
1) recorrer la lista
2) obtener cada emisor y borrarlo
Lo cual puedes llamarlo borrar_todos_los_emisores();

Y finalmente deberías borrar la lista como tal, cuando ya no hagan falta emisores en tu juego:
ds_list_destroy(global.laListaDeEmisores )
Los siguientes usuarios dieron las gracias a este tema: Marth

2
Preguntas y respuestas / Re:Que otros lenguajes reconoce game maker
« en: Noviembre 08, 2019, 04:41:33 pm »
Game Maker acepta, al menos en un versiones más viejas, la sintaxis de Pascal, creo que muchos no lo saben XD ni modo, tampoco es que Pascal fuese famoso en la actualidad, pero si se utilizó antes, hace mucho sentido.
Sin embargo, que acepte la sintaxis, no necesariamente significa que, acepte las funciones. Lo cuál también haría sentido puesto que estaríamos hablando de las bibliotecas estándar, si se quiere, del lenguaje Pascal.
Entonces, es lógico que no reconozca writeln(). Por otro lado, se puede utilizar los operadores relacionales esos raros como <> (distinto)  y las asignaciones raras de Pascal XD
Para finalizar, esta es mi intención: lograr dibujar mediante otro lenguaje una simple línea sin usar el draw_line, y dibujar un hola mundo sin usar draw_text. Gracias, cualquier idea recibirá un agradecimiento de mi parte.  ;D
Si quieres dibujar una linea sin usar draw_line() tendrás que dibujar tantos puntos haya entre medio del inicio y del fin. Lo cual me parece que será altamente costoso. Más teniendo en cuenta que, al menos en  :GM5: las funciones de dibujo son muy lentas. No quiero imaginar para versiones inveriores.
Luego, para dibujar un hola mundo sin draw_text() o lo haces con lineas, o con sprites, otra manera creo que no hay  XD
Los siguientes usuarios dieron las gracias a este tema: dixon

3
General / Re:Practicando máxima compatibilidad
« en: Noviembre 02, 2019, 01:09:18 pm »
Me parece una idea interesante sin embargo, me pregunto porqué alguien querría que un código portable a versiones tan viejas?
A no ser que esté programando en una PC de los 90, no creo que fuera conveniente XD


Los arrays no están formados por ifs. Son espacios de memoria adyacentes, que agrupan un tipo de dato homogéneo.(Al menos los arrays estáticos de toda la vida.)
Aún así puedes, simular un array utilizando ifs.

La forma en que se me ocurre, es declarar cierto número de variables que funcionen como índices. A saber:
espacio1 = 0;
espacio2 = 0;
espacio3 = 0;
espacio4 = 0;
espacio5 = 0;
Dónde se puede apreciar claramente la limitación más grande, que sería un fixed array. O un vector de tamaño fijado. Desconozco si existe en GM1
alguna función para crear variables en tiempo de ejecución. Así ,asumiré que no la hay.

Una vez declarada nuestra lista de variables, podrías crear un script que tome como parámetro el índice de la posición y retorne/escriba el valor:
scr_getVector( index);
var i = argument[0];
if (i<0 || i >5) exit; //estaría bien colocar un cartel de aviso al usuario

if (i==1)
    return espacio1;
if (i==2)
    return espacio2
if (i==3)
    return espacio3
if (i==4)
    return espacio4
if (i==5)
    return espacio5;
Y para guardar valores dentro del array:
scr_setVector( index , value );
var i = argument[0];

if (i<0 || i>5) exit;
if (i==1)
    espacio1 = value;
if (i==2)
    espacio2 = value;
if (i==3)
    espacio3 = value;
if (i==4)
    espacio4 = value;
if (i==5)
    espacio5 = value;
 
Los siguientes usuarios dieron las gracias a este tema: dixon

4
Preguntas y respuestas / Re:Cargar imagenes que el usuario prefiera.
« en: Octubre 16, 2019, 01:09:13 am »
En GameMaker8 cuentas, por suerte, con una función para ello.
En GMS la quitaron :'(
 XD

La función en cuestión es get_open_filename() ysirve para mostrar un cuadro de dialogo para seleccionar un recurso.
En este corto ejemplo lo utilizo para cargar un sprite y luego con dicho recurso creo un sprite dinámico para usarlo dentro del juego.
var res, spr;
res = get_open_filename("", "");
spr = sprite_add(res,0,0,0,0,0); //creas el sprite convenientemente segun tus necesidades

sprite_index = spr;

Luego usarías sprite_delete() para liberar la memoria del sprite ocupado.

Saludos! :3
Los siguientes usuarios dieron las gracias a este tema: Goganpis

5
Según entiendo quieres pasar un vector con cierta magnitud en una dirección dada.
Para ello cuentas con la función:
lengthdir_x(largo, direccion);
Eso devolvería la componente horizontal de un vector dado por dirección con magnitud largo.
Y similar, tienes:
lengthdir_y(...)
Para la componente vertical.

Saludos! :)
Los siguientes usuarios dieron las gracias a este tema: Marth

6
Preguntas y respuestas / Re:AYUDA CON SISTEMA DE PISTONES/MARTILLOS
« en: Septiembre 20, 2019, 03:55:58 am »
Para lograr ese comportamiento necesitas una variable que controle el estado del objeto. Más bien sería cómo colocar condiciones, si se cumplen pasar de un estado a otro.
Inicialmente deberías crear la variable que controlase el comportamiento, osease, la variable que controla el estado:
Ev_create
estado = -1;
Luego sería definir las constantes que puede tomar la variable estado. En GMS puedes usar enum para enumerar constantes, de momento mantenerlo simple sería lo óptimo, entonces puedes definir nuevas variables simplemente para fines de documentación y para que sea más fácil leer el código:
Ev_create:
//definimos variables auxiliares para darle un valor a estado
ES_ESPERANDO = 0
ES_CAYENDO = 1
ES_SUBIENDO = 2
Estas variables ayudarían a determinar el estado actual del objeto, si está cayendo , si está arriba esperando o si está subiendo para retornar a su posicion.
Finalmente bastaría programar el comportamiento para que cambie de estados, ya dependiendo de cuándo se quiere que ocurran estos eventos.
Por colocar un ejemplo, podíamos hacer que nuestro pistón cayese cuando el personaje se encontrase debajo:
Ev_step:

if (estado == ES_ESPERANDO) //estamos arriba esperando a que pase el jugador
    if (collision_line(x+0,y+0,x+0,y+50, obj_personaje, false, true))//si se detecta que el jugador esta abajo del piston
        estado = ES_CAYENDO; //determinar que está cayendo

if (estado == ES_CAYENDO) //si el estado es cayendo
     vspeed = 2;  //aumentar la velocidad vertical para que caiga
Esto haría que el pistón verifique si el jugador está debajo y cayese en ese caso.
Ahora tocaría hacer que se detuviera cuando colisiona con el suelo, y que subiera, para que al colisionar de nuevo con el techo, por ejemplo, se reestablezca a ES_ESPERANDO.

Para verificar constantemente los estados y el comportamiento estaría bien el evento step, en general. A menos que la lógica no lo requiera XD
   
Los siguientes usuarios dieron las gracias a este tema: Yoryos

7
Preguntas y respuestas / Re:Sistema de Batalla [04/08/2019]
« en: Agosto 04, 2019, 07:23:01 pm »
Bueno, que puedo decir, casi que te respondiste solo  XD
Si quieres dividir el ataque del jugador con la defensa del enemigo, solo debes aplicar la fórmula.
danio = obj_jugador.ataque / defensa;
vida -= danio;
Y variaría si se manejas decimales o no, si son redondeados a enteros:
danio = floor(obj_jugador.ataque / defensa);
vida -= danio;

Y claro, ya vendría el hecho de cómo tienes implementado el motor como tal para saber si va en un evento de colision o en una alarma, por ejemplo.
Los siguientes usuarios dieron las gracias a este tema: NU597

8
Preguntas y respuestas / Re:Lista de elección aleatoria
« en: Agosto 03, 2019, 02:07:27 am »
Bueno Yo lo haria de esta forma...

Código: [Seleccionar]
var tanteo, maxObj, Lista, ListaMax;
maxObj = 2; // Numero de repeticiones (numero maximo de objetos tanteados)
ListaMax = 10; // Espacio de la lista

var i;
for(i=0;i<ListaMax;i+=1)
    {// Vaciar Lista
     Lista[i] = 0;
    }

var i;
for (i=0;i<maxObj;i+=1) // Repetir el ciclo hasta llegar al limite de objetos en este caso "3"
    {// Tantear maxObj que tienen que ser ajustados
     tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
     
     Lista[tanteo] = 1; // Ajustar como creado o elegido como lo llames
    }

PD: Ya el array Lista tiene que ser declarado anteriormente o dara error otra opcion seria usar ds_list.
El único problema que tiene este algoritmo es que, la instrucción mas importante:
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
Podría dar un numero repetido y el ciclo contaría de todas maneras la iteración. En el peor de los casos se dará para un elemento repetido y no habrán 3 elementos seleccionado sino 2 o para peor, solo 1.
Lo que cabría hacer es, verificar, que el número que saca "tanteo" no está repetido.
  tanteo = irandom(ListaMax); // Aleatoriedad del tanteo a elegir
 if (lista[tanteo] == 0)
     lista[tanteo] = 1;
  else
      i -= 1;  //repetir el ciclo restando -1, para decir que no cuente esta vuelta. (Aclaro que esto para mi desde un punto estructural siguiendo el paradigma de programacion estructurada, esta super mal XD )

El problema con este algoritmo es, lo que se llama "aplazamiento indefinido", que en el peor de los casos cae siempre en un espacio ocupado y se repite innecesariamente muchas iteracion.
Por lo que:
Citar
cual seria la manera mas eficiente [...]
No es la mejor manera, pero sigue siendo una solución corta de implementar. <3
Los siguientes usuarios dieron las gracias a este tema: cristopher2545

9
Preguntas y respuestas / Re:Lista de elección aleatoria
« en: Agosto 02, 2019, 03:00:25 pm »
Hace nada respondí un tema sobre inventario, que si uno lo abstrae de una manera conveniente podrías convertirlo en lista.
Personalmente te recomiendo usar las funciones para listas: ds_list_*
Ya que estas cuentan con funciones muy interesantes que a la par de útiles, como mezclar y sacar elementos. Básicamente, lo que necesitas.

Dado que, tu lista de artículos está conformado por un grupo de objetos que pueden instanciarse:
1) Yo crearía la lista y colocaría el nombre de los objetos
2) Mezclaría la lista
3) Sacaría el elemento que esta al tope
4) Lo instanciaría
5) Mezclaría la lista
6) Sacaría el elemento que esta al tope
7) Instanciaría ese elemento
8 ) Mezclaría la lista
9) Sacaría el elemento que esta al tope
10) Instanciaría ese elemento

Entonces tendrías tres instancias de objetos distintos.

Hmmm, en otro caso, si son simplemente variables, podrías hacer un ciclo que recorra la lista indefinidamente, iniciadas con 0 al inicio, e ir usando un contador que vaya registrando la cantidad de unos que se ponen aleatoriamente dentro de la lista.

Saludos!
Los siguientes usuarios dieron las gracias a este tema: cristopher2545

10
Preguntas y respuestas / Re:Sistema de inventario [2019]
« en: Julio 31, 2019, 08:52:04 pm »
Saludos!
Bajé el editable y lo miré un poco. El problema que tiene es que solamente está almacenando el valor en una única variable.
Lo cual no sirve de mucho, aunque visualmente, si, cumple con parecerse a lo que es un menú de selección. No serviría de mucho, el hecho de que la variable guarde un valor del 1 al 9, puesto que necesitaríamos saber qué item se aloja en cada lugar.

Una variable común como la que estás utilizando, en este caso llamada "Select" es una variable que puede almacenar un único valor a la vez.
Deberías usar un array(también llamados arreglos, vectores o listas) lo que sería más sencillo de hacer, que si tuvieras por ejemplo 9 o 10 variables para guardar un item en cada espacio.
Se entiende por un array, a una variable que es capaz de almacenar varios valores simultaneamente.

Un ejemplo práctico usal es hacer uso de una variable de este tipo para guardar los meses del año. En Game maker tendríamos la estructura como:
mes[1] = "enero";
mes[2] = "febrero"
mes[3] = "marzo"
mes[4] = "abril"
mes[5] = "mayo"
mes[6] = "junio"
mes[7] = "julio"
mes[8] = "agosto"
mes[9] = "septiembre"
mes[10] = "octubre"
mes[11] = "noviembre"
mes[12] = "diciembre"
Como puedes notar, a diferencia de una variable común a la que solo se le asigna un nombre, como "Select", la variable de tipo array, tiene llaves cuadradas "[" y "]", lo cual indica que es una variable capaz de almacenar varios valores al mismo tiempo.
También como puedes notar, la variable lleva consigo, un numero, en este caso va del 1 al 12, lo cuál indica la posición o lugar de un determinado valor dentro de nuestro array.

Si mostrásemos un mensaje, queriendo ver el mes que está dentro de la posicion 3, haríamos en GML:
draw_text(0, 0, string( mes[3]);
Lo cuál mostraría al mes de "Marzo" en pantalla.

Para mostrar, toda la información en pantall,a como has de suponer, se tiene que recorrer la lista entera para poder mostrarla, por ejemplo:

draw_text(0, 20, string( mes[1]);
draw_text(0, 40, string( mes[2]);
draw_text(0, 60, string( mes[3]);
// ... y asi en lo sucesivo hasta
draw_text(0, 240, string( mes[12]);
Lo cual mostraría los valores uno, debajo de otro, enseñando en pantalla así los 12 meses del año. Como puedes notar, nuevamente, se usa un número que acompaña a la variable "mes" , para determinar qué valor mostraremos. Ese número que acompaña se llama usualmente "índice" (o posicion, lugar o del inglés, "index"). Entonces para nuestro ejemplo del mes de Marzo, la variable mes[3], tiene el indice tres.

Extrapolando la explicación a tu sistema de inventario. Estaría bien ponerle un nombre adecuado, por ejemplo:
inventario[1] = ""
inventario[2] = ""
inventario[3] = ""
inventario[4] = ""
inventario[5] = ""
inventario[6] = ""
inventario[7] = ""
inventario[8] = ""
inventario[9] = ""
Ahora hemos creado la variable "inventario" con  9 lugares disponibles para valores. Es decir, "inventario" ahora puede almacenar simultáneamente 9 diferentes valores. Nosotros colocamos comillas vacías ("") para indicar que el inventario está vacío.
Pero en la práctica podemos asignar cualquier valor que nos convenga, por ejemplo:  inventario[4] = "pocion magica".

Hay maneras más automatizadas de crear, y mostrar un array, pero eso ya depende de cuán familiarizado estés con el uso de ciclos no condicionados (o ciclo for).

Pero bien, ahí tu me dices las dudas que tengas, así explayamos más aún el tema.


Los siguientes usuarios dieron las gracias a este tema: NU597

11
Me gusta tu algoritmo, fácil de entender e intuitivo de primeras. Aún asi te dejo mi propuesta, un script que hace lo mismo pero personalizado.
var xs = argument0;
var ys = argument1;
var obj = argument2;
var radio_min = argument3;
var radio_max = argument4;

randomize();

var d = irandom(360);
var r = irandom_range(radio_min, radio_max);
var xx = cos(degtorad(d)) * r;
var yy = -sin(degtorad(d)) * r;

instance_create(xs + xx, ys + yy, obj);

Bastaría llamarlo como:
scr_create_radio(x, y, objeto, 50, 100);

Para que crease el item dentro del radio de 50 y 100 pixeles.
Habría que colocar la condición para cuando no hay espacio libre solamente.
Los siguientes usuarios dieron las gracias a este tema: rick136

12
Preguntas y respuestas / Re:Ficheros JSON
« en: Julio 14, 2019, 05:38:38 pm »
Los archivos JSON (javascript Object Notation) son archivos ligeros que se utilizan para el intercambio de datos, los cuales, por su estructura son fáciles de leer tanto para las personas como para las aplicaciones.
    Están construidas con dos estructuras basicas:

  • Una coleccion de pares del tipo nombre/valor. Lo que en Game Maker se conoce como un ds_map
(He aquí la razón de por qué te dijeron que uses JSON's con ds_maps)
  • Una lista ordenada de valores, conocidas en Game Maker como ds_list

Game Maker studio 2 cuenta con una funcion específica llamada json_decode(). Con esta funcion puedes decodificar una pieza de JSON y convertirla en un ds_map, para trabajarla entonces con Game Maker.

Como dato adicional, el fichero JSON es un archivo que es independiente del lenguaje, y se usa para modelar un objeto.
No sé si hayas trabajado antes con lenguajes "puros", si así puede decirseles, como C++/C/Java/Python/etc etecé XD
Pero mmm podrías tener algo como:
[gml]
objeto fantasma
solido = false
visible = true
[gml]
Que vendría a modelizar muy por encima un objeto de Game Maker. Entonces si quisiéramos por alguna razón hacer un JSON escribiríamos:

Código: [Seleccionar]
{
      "nombre": "fantasma",
      "solido": false,
      "visible": true
}
Nótese que lo que vendría siendo el nombre de las variables vá entre comilla, sustituiríamos el signo de igual = por los dos puntos : y que se separan con comas ,
También se pueden poner valores como array dentro de un JSON, e incluso otro JSON como campo de éste.(o que es lo mismo, un JSON dentro de una "variable").

No sé cuál es la máxima utilidad de tu Game_save(), pero yo a efectos prácticos usaría un text file, guardando por linea cada dato útil. Luego simplemente los recuperaría ciclicamente.

Saludos! :)

edit:
 XD me olvidé de dejar la página maestra donde explica todo, en spanish, detallado:
https://json.org/json-es.html
Los siguientes usuarios dieron las gracias a este tema: Johann, Marth

13
Juegos completos / Re:Lab 23 [Windows]
« en: Noviembre 10, 2018, 04:21:51 pm »
Pues si, la verdad es que interactua de manera muy rara  XD

Al intentar esconderme en el Nivel 1, al instante de hacerle click a la puerta, el cursor automaticamente se redirige hacia arriba a la izquierda. Lo que hace que eventualmente, al parecer, se salga del escondite sin hacer nada.
Quiero decir, al hacer click entra una milésima de segundo y sale del escondite para moverse solo hacia la izquiera, es super raro de explicar XD  [imagen 1]

Luego, para utilizar el menu, pues ahí si que está bastante complicado, creo que las imagenes son autoexplicativas(?
Mientras el cursor está en otro lado, lo items se seleccionan de una manera bastante rara. Quiero decir, ni siquiera el cursor está encima de los items y ya se seleccionan. Aún, si asi fuera, el colocar el cursor encima de los items, no los selecciona, sino que hay que buscar en la pantalla, dónde pasar el mouse por encima para que puedan seleccionarse. [imagenes 2 y 3]

Y bueno, el error gráfico de que se vean lineas entre los tiles XD
No pasé mucho el juego porque no tuve suficiente paciencia :P


Los siguientes usuarios dieron las gracias a este tema: Marth, Yuzo

14
Preguntas y respuestas / Re:Me explican las siguientes funciones?
« en: Octubre 28, 2018, 05:33:43 pm »
Bueno, ahí está el claro ejemplo de qué si utilizas el término incorrecto, se puede entender otra cosa xD

Todas las palabras reservadas, statements, se encuentran en el manual. Concretamente en el apartado: "The Game Maker Language(GML)" / "GML Language Overview"

Do, While, repeat, for. Son bucles/ciclos.

Break,Continue. Son modificadores de flujo para los bucles anteriores.

If, switch. Son condicionales de seleccion.


Las explicaciones, obvio, están ahí.
Los siguientes usuarios dieron las gracias a este tema: HKaichim

15
Preguntas y respuestas / Re:Me explican las siguientes funciones?
« en: Octubre 28, 2018, 03:47:40 pm »
Muy buenas.

Primero que nada, tienes que entender que no son funciones como tal, sino que son sentencias. Lo que viene significando, una instrucción. Más concretamente: "while" e "if" son sentencias condicionales.
        Es decir, una sentencia condicional es aquella que contiene y evalua una condición. En este caso while se utiliza para crear un ciclo dada una condicion:
while(llueve)  //mientras llueva...
  usar_paraguas();  // usar_paraguas
Luego, la sentencia (o instrucción) if, se utiliza también para evaluar una condicion, pero es para determinar un estado concreto.
if (tengo_hambre)
   comer();
Una variante de la sentencia if es if/else, para elegir, entre 2 caminos, por decir algo.
if (tengo_sueo) /7si tengo sueo
     dormir();
else //sino
    tomar_cafe();

Luego, globalvar y var son palabras clave(tambien se les llama palabras reservadas del lenguaje) que se utilizan para crear variables. Concretamente cada prefijo especifíca un alcance diferente para una variable. Lo cual, si bien, no es un tema complicado, explicarlo llevaría tiempo considerable.

Para terminar, recuerdo, no son funciones, son palabras reservadas. Son palabras que utiliza el lenguaje para determinar la sintáxis del código, es decir, para saber, cuando hay que hacer un ciclo, cuando tomar una decisión, cuando crear una variable temporal.


Luego, una función es un proceso que devuelve o no un valor. Más fácil de decir, es un subprograma que realiza una tarea.
Son fácilmente detectables porque llevan paréntesis y un grupo de parámetros.
var a; //esto es una sentencia 
asignar(a, 10) // esto es una funcion
Más arcaicamente, lo anterior es una llamada a una función y no una función definida como tal. Pero a fines prácticos es facilmente identificable para saber cuando llamar "funcion" a algo y cuándo no hacerlo.

Puede sonar un poco pretencioso hacer una explicación tan larga, pero es necesario, que sepas qué es cada cosa, sino, al momento de escribir una duda, es probable que se generen mal entendidos al no utilizar los términos de la manera correcta.
 
Si quieres alguna explicación extra, solo pregunta. (y)


Saludos!
Los siguientes usuarios dieron las gracias a este tema: HKaichim

Páginas: 1 2