Noticias

Se ha publicado un nuevo servicio, el Portal de Juegos Online

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

Páginas: 1 2 3
16
Preguntas y respuestas / Re:Mover una view al tocar un objeto
« en: Abril 16, 2019, 04:15:13 am »
Creo que ocurre , porque al estar la verificacion de colision dentro del evento step, cada vez que se superpone un borde, la x_view se aumenta.
Por lo que el personaje pasa por encima y la x_view se aumenta muchas veces.

tengo dos soluciones:
1) tendrias que mover al player a una distancia grande de manera que deje de tocar el borde y consecuentemente deje de moverse la x_view al no cumplirse la condicion de colision
2) usar una variable booleana que indique que ya se tocó el borde para no seguir moviendo indefinidamente la x_view
Los siguientes usuarios dieron las gracias a este tema: ElKopiraih

17
amigo te dejo un grafico de como funciona el ciclo for en 4 pasos:
El ciclo for es eso, un ciclo, que se reptite contadas veces. En programación se conoce como "ciclo definido o ciclo finito" puesto que se sabe, cuantas vueltas va a dar el ciclo de antemano.
En nuestro ejemplo del inventario iba a dar 4 vueltas.

analizemos la estructura  de FOR:

1º) se crea una variable contador, generalmente y por comodidad, en muchos lugares se la llama "i" del "iterator" en español iterador. Que es la variable que cuenta las iteraciones(repeticiones de codigo).
Esta parte se ejecuta 1 sola vez. Declara la variable para usarla como contador.

2º) la condicion que repite el ciclo. Esta parte se ejecuta varias veces y te indica la condicion que tiene el ciclo para seguir ejecutandose. Generalmente es un numero entero o una expresion de "i es menor a 10" y de ese estilo para que el ciclo se repita determinada cantidad de veces.

3º) aqui se ejecutan las acciones que se quieren repetir. Todo el codigo dentro se repite cada vez que el ciclo da vuelta.

4º) aqui se aumenta (o disminuye) el contador de manera de que se vaya sumando éste y termine en algun momento la condicion.
Por lo general se le suma de a 1 , raras veces vá hacia atrás o se suman en mas cantidad.
Luego de este 4º paso se vuelve a repetir el 2º paso y así, hasta que la condicion deje de cumplise.

Un ejemplo:

for(i=0; i<2; i++){
         instance_create(o_nave_enemiga, x,y)
         audio_play_sound(snd_campana,1,0);
}
1) Este codigo inicializa la variable "i" en cero.
2) Verifica si la condicion es verdadera. "i" es menor a 3? en efecto, puesto que es igual a cero.
3) se crea una nave espacial y hace un sonido
4) aumenta el contador en 1 (i++ o bien se puede escribir como i+= 1), ahora vale 1
5) se verifica la condicion: "i" es menor a 3? en efecto, puesto que es igual a 1
6) se crea una nave y se hace un sonido
7) se aumenta el contador "i" en 1, ahora vale 2
8 ) se verifica la condicion "i" es menor a 2? no, puesto que es igual a 2, y 2 no es menor a 2.
9) termina el ciclo sin ejecutar acciones. No se vuelve a entrar en él

Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos

18
hola amigooou

hay dos maneras de trabajar con arreglos(vectores, arrays, listas, etc).
una es usando los arreglos convencionales de gm:   vector
la segunda es usando listas dinamicas de gm: ds_list_create()

yo te voy a explicar usando arreglos estandar.

primero hay que declarar el arreglo e inicializarlo con un valor que nos indique que esta vacio, por ejemplo vamos a poner el 0:
(Evento Create)
global.MAX = 4; //maximo de slots disponibles en el inventario
for(i=0; i<global.MAX; i++)
      inventario[i] = 0; // el cero indica que no hay nada en el inventario

Esto crea el arreglo con 4 elementos, que son el numero 0 que a efectos practicos, nos indicaria que no tienen items.

Luego, creamos un script desde el panel de recursos, que usaremos para obtener un espacio libre.
scr_obtener_slot
for(i=0; i<global.MAX; i++){  //recorremos el arreglo
      if (inventario[i] == 0)   //si hay un slot que este vacio
           return i;    // devolvemos la posicion que esta desocupada (puede ser 0, 1, 2, 3)
}

return -1;  //en caso de que este todo ocupado, devolveremos el indice -1 que no existe, por lo tanto es un error
Este script nos devolvera el primer indice que esté desocupado. O -1 si esta todo lleno de items.

Luego para dibuijar las cosas tendrias que ir al Evento Draw y colocar algo como:
for(i=0; i<global.MAX; i++){
      draw_sprite(spr_cuadradito_del_inventario, x + (sprite_get_width(spr_cuadradito_del_inventario) * i, y); //esto dibujaria tantos cuadraditos como maximo de slots haya en el inventario
}

for(i=0; i<global.MAX; i++){ //este ciclo dibujaria los items

     if (inventario[i] == "navaja") //si en el espacio "i" hay una navaja, dibujarla
                 draw_sprite(spr_navaja,  x + (sprite_get_width(spr_cuadradito_del_inventario) * i, y);

     if (inventario[i] == "comida") //si en el espacio "i" hay una navaja, dibujarla
                 draw_sprite(spr_comida,  x + (sprite_get_width(spr_cuadradito_del_inventario) * i, y);
}

eso dibujaria el inventario y los items necesarios, Cabe resaltar que los sprites tienen que ser igual tamaño que el sprite que hace de cuadradito en el inventario

Luego la forma de guardar un item, por ejemplo Evento Colision de Player contra Pocima:
var espacio_vacio = scr_obtener_slot();
if (espacio_vacio != -1) //si hay espacio vacio
          inventario[espacio_vacio] = "pocima"

no probe el codigo, pero creo que la idea está
Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos

19
Preguntas y respuestas / Re:Duda sobre UDP y TCP
« en: Abril 04, 2019, 02:32:53 pm »
Complicado no es realmente, solo que hay que tener en cuenta muchas cosas. Primeo y principal, seria saber sobre como manejar buffers. Puesto que es la manera en que se mandan los datos a trevez del networking en GMS.
Para una explicacion detallada tenés el tutorial de Juca:
https://www.comunidadgm.org/articulos/tutorial-buffers-(parte-1-3)/msg125452/#msg125452

Si querés saber como funciona UDP podés mirar este tutorial de Ashe:
https://www.comunidadgm.org/articulos/tutorial-online-udp-39dll/msg128337/#msg128337
Que si bien usa una vieja DLL, el concepto de como funciona es el mismo. La diferencia con GMS es que tiene un propio evento asincrono para procesar los datos en vez de hacerlo en el evento step.

Si querés una explicacion detallada de como manjar TCP tenés mi tutorial extenso:
https://www.comunidadgm.org/articulos/(programacion)hacer-un-juego-multijugador-online-con-game-maker-studio-ver2/

Ahora, podés leer el tutorial de TCP y tratar de hacer algo con eso.
Una vez que dominés ese protocolo, solo extrapolalo a UDP. Que es en escencia mas sencillo que TCP.

////////////////////////////////////////////////
Revisando la Doc de otro motor(Godot) encontre esto:
https://gafferongames.com/post/what_every_programmer_needs_to_know_about_game_networking/

Está en español de donal trump, pero plantea el asunto el networking bastante especificado para juegos

saludos
Los siguientes usuarios dieron las gracias a este tema: somnus

20
Hola amigo, podrías combinar la respuesta de este post:
https://www.comunidadgm.org/preguntas-y-respuestas/comprobar-una-variable-de-todas-las-instancias-resuelto/msg136770/#msg136770

Que a grandes rasgos, lo que hace es almacenar en un vector todas las instancias creadas de un objeto determinado.
La parte que te tocaría programar sería la de elegir aleatoriamente y luego hacer que el objeto A, siguiera al objeto tomado aleatoriamente.

randomize();
var cant = instance_number(obj_B);
var insta = vector_instancias[irandom(cant)];

move_towards_point(insta.x, insta.y, 5);
Ese codigo lo que hace, es escoger aleatoriamente uno de los tantos objetos B que haya y lo sigue.

Esta un poco tosco y tal, pero creo que la idea se entiende.
Los siguientes usuarios dieron las gracias a este tema: Taki-A

21
Preguntas y respuestas / Re:sonido seguidos
« en: Marzo 23, 2019, 04:14:28 pm »
Efectivamente.
Aunque tambien se puede implementar con una alarma, como dato.
Los siguientes usuarios dieron las gracias a este tema: dubaldo

22
Preguntas y respuestas / Re:sonido seguidos
« en: Marzo 22, 2019, 07:35:59 pm »
Usa audio_is_playing() para verificar que no se esté reproduciendo tal sonido, luego larga el que sigue.

https://docs.yoyogames.com/source/dadiospice/002_reference/game%20assets/sounds/audio_is_playing.html
Los siguientes usuarios dieron las gracias a este tema: dubaldo

23
Bueno, lo que estás haciendo mal es que, al usar el nombre del recurso "obj_comida" estás diciendo que borre todas las instancias de ese objeto.
En cualquier caso deberías obtener el ID de la instancia a destruir y se destruiría solo esa instancia y no todas.

Yo te recomendaria usar instance_nearest(...):
https://docs.yoyogames.com/source/dadiospice/002_reference/objects%20and%20instances/instances/instance%20functions/instance_nearest.html

Para obtener la instancia mas cercana,  y destruirla:

if distance_to_object(obj_comida) < 3 and keyboard_check_pressed(vk_space)
var comida_cercana = instance_nearest(x,y, obj_comida);
if (comida_cercana != noone)
{instance_destroy(comida_cercana )
    if vida >= 0 {vida +=10}
    if vida > 100 {vida = 100}
    }
Los siguientes usuarios dieron las gracias a este tema: Fashion_Trozos

24
Preguntas y respuestas / Re:no se si alguien pueda ayudarme
« en: Marzo 12, 2019, 01:19:18 am »
Si, efectivamente el problema era la máscara. La definí como MASK en un sprite.
Los siguientes usuarios dieron las gracias a este tema: Diego121221

25
Bueno el problema se da en la segunda condicion, puesto que pide que:
x sea menor a 10 y mayor a 590, cosa que no puede ser.

En todo caso supongo que sería:
x mayor a 10 y menor que 590

Con la coordenada Y pasa exactamente lo mismo.
Los siguientes usuarios dieron las gracias a este tema: WMKILLER

26
Preguntas y respuestas / Re:no se si alguien pueda ayudarme
« en: Marzo 09, 2019, 03:48:30 am »
Bueno amigo hay varias cuestiones.

Uno, no deberias pedir a la gente que mire tu ejecutable y te arregle el problema. Primero porque es cansador, uno abre el proyecto de otro, que está programado de cierta manera y tiene masomenos ponerse en los zapatos para ver como es que funciona internamente.
Segundo, porque así no aprendés realmente cómo de arregla el error o como y porqué se produce.
Pero si aún te interesa saber como se adjunta un archivo, acá esta la solucion:
https://www.comunidadgm.org/propuestas-y-soporte/191c243mo-agrego-un-archivo-(-imagen-audio-demos-juegos-)-en-el-foro/

Dos, no deberías copiar y pegar codigos porque si. Primero porque no se aprende nada si no se lo analiza y entiende. Y segundo porque no todos los codigos son universales, cada uno tiene una manera de hacer las cosas y probablemente no sea compatible uno con el otro.

Tres, al momento de preguntar deberías colocar el código dentro del post para hacer más claro el problema. Primero porque se resuelve mas facilmente la duda al tener el problema puntualmente indicado donde falla y mejor si explicas lo que intentas hacer y como intentaste implementarlo. Segundo porque en un futuro, gente que tenga el mismo problema va a poder ver el problema/la solucion sin tener que navegar por todo el editable.

Todo esto te lo digo con el afan de que aprendás realmente a programar con GM, y para que los demas usuarios futuros se ayuden de la solucion concreta.
Los siguientes usuarios dieron las gracias a este tema: Johann

27
Son bastante malos los tutoriales de hektor profe, para principiantes.
Usa notacion super acoplada y poco intuitivas para los aprendices.

Yo te recomiendo que desaglomerés el programa en algo que sea cómodo, sino pasan cosas como esta: copio todo lo que veo sin entenderlo y ahí esta el problema.

No soy partidario de solucionar problemas de un tuto o de un engine.
Y seguramente suene mala onda pero... mirate el video de nuevo en todo caso.
Los siguientes usuarios dieron las gracias a este tema: NiuWeb, Fashion_Trozos

28
Preguntas y respuestas / Re:VARIABLE PYTHON3.6
« en: Febrero 21, 2019, 11:55:02 pm »
Bueno en el mismo manual está indicado como se usan los bufffers:

https://docs.yoyogames.com/source/dadiospice/002_reference/buffers/index.html

Ahí indica el tamaño que tendrá el buffer en bytes y el "alineamiento" que es decir cada cuantos bytes está separado.
Si yo pongo el alineamiento a 4 bytes, entonces las variables que guarde tendrían que tener ese tamaño o menos.
Acá está la lista de tipos que hay, y cuanto ocupan:
https://docs.yoyogames.com/source/dadiospice/002_reference/buffers/buffer_write.html
Hay que tener en cuenta la conversion de bits a bytes.
Los siguientes usuarios dieron las gracias a este tema: nonoroman

29
Preguntas y respuestas / Re:VARIABLE PYTHON3.6
« en: Febrero 21, 2019, 02:11:26 pm »
Yo sé de python pero nunca lo usé para enviar datos a un server.
De todas maneras no parece ser algo realmente complicado, según el manual de Game Maker, dice que al enviar los datos con raw, se envia un solo coso de bytes.

Solo tendrías que seguir la estructura del buffer que definiste, es decir el orden en que pusiste los datos.

Mi pseudocodigo sería:

1- obtener el paquete de datos con el servidor2- saber el tamaño del paquete
3- ir dividiendolo en partecitas para rescatar los datos
Eso creo que ya tiene que ver qué funciones dispone Python para manejar buffers.
Los siguientes usuarios dieron las gracias a este tema: nonoroman

30
Preguntas y respuestas / Re:cancelar colision ?
« en: Febrero 13, 2019, 06:26:55 pm »
Se puede, usando una condicion if:

if (sprite_index <> spr_verde){ //si el sprite es diferente de verde, colisionar
     //efectuar comandos de colision
}

// en otro caso, no sucede nada.


Aunque claro, depende de cómo estés haciendo las cosas, si con los eventos predefinidos o a través de un metodo de colision como collision_rectangle(...).
Los siguientes usuarios dieron las gracias a este tema: florgm

Páginas: 1 2 3