Noticias

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

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

Páginas: 1
1
hmm depende de varios factores, pero digamos que la regla general es que si no ves que sea necesario (que se ponga lento el juego) entonces no hace falta que lo implementes, obviamente hay un limite, si tienes 100 instancias puede que no lo notes, pero si tienes 1000 puede que sea mas notable (o no)

así que primero puedes probar rapidamente colocando el maximo numero de unidades que crees que puedan existir (deberia existir un limite incluso siendo un rts) y mira si se pone lento (en varios pcs si puedes hacerlo)

saludos.
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

2
Preguntas y respuestas / Re:[Android] Duda para online 2 personas
« en: Diciembre 11, 2018, 11:44:50 pm »
Hola colega, pasate por mis tutoriales, ah no, asi no era XD

ya en serio, si vas a hacer un juego en tiempo real , te conviene de sobrada una conexion UPD, la TCP retrasa todo porque es un protocolo que verifica que se haya enviado el paquete completo sin romperse.
En cambio el udp envia datos todo el tiempo sin importar cual iba primero segundo, o si se perdió por ahí. Lo cual no importa mucho realmente ya que, una instancia al moverse tanto por el mapa es imperceptible o a lo sumo se genera eso que la gente llama "lag" que le dispara al enemigo pero este desaparece un segundo y re-aparece mas adelante.

No te recomiendo para nada usar mis tutoriales de TCP, jugar algo en tiempo real con eso va a ir super lento.


EDit: bueno, veo que publicaste como 5 segundos antes xD
Lo que deberías hacer es si, establecer un servidor que pueda alojar partidas. Un servidor que reenvie los datos del juego, porque muchas veces uno mismo como jugador no puede (o lo mas usual, que no sabe) abrir puertos, configurar el firewall. Es mas, los juegos triple A, usan varios puertos a la vez, no uno solo. Entonces deberías configurar el servidor para tener los puertos abiertos.
Sino sería hacer un Hole Punching para conectar sin mucho trabajo:
https://en.wikipedia.org/wiki/Hole_punching_(networking)


Con respecto a qué enviar al servidor.
Lo ideal sería mandar una señal cuando se ejecute cierta condicion. Por ejemplo, una vez que se haya atacado al hormiguero, el hormiguero del cliente debería enviar esa señal al servidor y entonces el servidor debería repartir la misma señal a los otros hormigueros.
Basicamente:
1-Cliente1 ataca hormiguero.
2-El hormiguero de cliente1 envia al servidor la señal.
3-El servidor retransmite a todos los demas clientes.
4-Los otros clientes reciben la señal.
5-Los hormigueros en los otros clientes, comienzan a generar hormigas.


Citar
deberia hacer que si el cliente pulsa el botón de atacar, esta señal se envie al servidor? Así no tendria que sincronizar la posicion de todas las hormigas, junto a su comportamiento y tal, que pueden ser cientas en el mapa.
En un principio debería funcionar, pero el problema es que si se pierde el paquete, por ejemplo desde el cliente al servidor. Solo el cliente que crea las hormigas va a verlas salir. Mientras que los demás nunca recibirían la señal que se perdio en el trayecto.
Lo mismo podría pasar si desde el servidor se pierde el paquete hacia algún cliente.
A mi, me parece que deberías reducir las coordenadas a un dato pequeño, quiza un shortInt, ya que la resolucion no pasaria de los 2000px entonces ocuparía menos bytes, no se cuanto ocupa eso, en C al menos sé que son 2 bytes, mas otros 2 para la coordenada y, serían 4 en total por cada instancia. Poniendole que sacas 500 hormigas, algo un poco inusual, 2000bytes que son a lo sumo 2kb? Solo enviando hormigas. Yo CREO que no debería representar un problema. CREO

De todas maneras sería cuestion de probar eso sino alguna optimizacion, por ejemplo enviar la mitad de las posiciones en un step, la mita en otro, si total, es practicamente irrelevante tener la posicion exacta de cada hormiga. No así su estado de vida/muerto.


Otra cosa que recomendaba siempre el makero Texic, al hacer este tipo de juegos, era, enviar la señal para que se creen las instancias en los demas clientes, y que cada uno haga el calculo por si mismo. Lo cual puede ser el camino mas largo, pero iría bastante fluido el trafico de red.
 
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

3
Preguntas y respuestas / Re:Permitir crear y eliminar frases.
« en: Septiembre 26, 2017, 01:29:16 am »
Había pensado algo así:

Primero crea un script llamado array así:
///array(val1, ..., valN);
var n = argument_count;
var s;
for(var i = 0; i < n; i++)
    s[i] = argument[i];
return s;
Ahora, en cada evento que requieras:
///Evento create de algún controlador
globalvar preguntas;
preguntas = ds_list_create();
///Donde quieras añadir las preguntas
//Añade un arreglo a la lista, que contendrá una pregunta.
ds_list_add(preguntas,
    array(
        "La pregunta",
        1, //La respuesta correcta
        "Respuesta 1",
        "Respuesta 2",
        "Respuesta 3"

        /*
       Estos arreglos que se guardan en cada índice de la lista
       guardan los datos de la pregunta: El índice [0] sería el
       texto de la pregunta, el índice [1] sería la respuesta
       correcta (siendo el número 1 el índice [2]), y del índice
       [2] hacia adelante son las posibles respuestas.
       */
    ));
/*
Repite todo este código con tantas preguntas como necesites,
obviamente modificando los datos de cada pregunta.
*/
///Y cuando queras borrar una pregunta
ds_list_delete(preguntas, 0); //Borramos la primera pregunta
La lista se usaría algo así:
///Por ejemplo, un ciclo que recorra todas las preguntas
for(var i = 0; i < ds_list_size(preguntas); i++)
{
    var pregunta   = preguntas[| i];
    var respuestas = "";

    for(var j = 2; j < array_length_1d(pregunta); j++)
    {
        /*
       Recorremos las respuestas, que se encuentran desde el
       índice [2] hasta el último.
       */
        respuestas += string(j - 1) + ". " + pregunta[j] + "#";
        /*
       Añadimos cada respuesta en una línea, de la forma:
       1. respuesta 1
       2. respuesta 2
       etc.
       */
    }
    show_message(
        "La pregunta es: " + pregunta[0] + "#" +
        "La respuesta es la número " + string(pregunta[1]) + "#" +
        "Las respuestas son:#" + respuestas

        /*
       Mostramos un mensaje que debería verse así:

       La pregunta es: La pregunta
       La respuesta es la número 1
       Las respuestas son:
       1. Respuesta 1
       2. Respuesta 2
       3. Respuesta 3
       */
    );
}

Tal vez te sirva revisar las funciones de listas para entenderlas mejor:
http://docs-gamemaker-es.blogspot.com.co/2017/09/estructuras-de-datos.html

El código podría tener errores, no lo he probado aún.
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

4
Preguntas y respuestas / Re:Permitir crear y eliminar frases.
« en: Septiembre 25, 2017, 01:53:09 am »
Creo que para eso sería mejor que usaras estructuras de datos en vez de simplemente archivos INI. Guardar las preguntas y respuestas en una lista (donde solucionarías el problema que tienes), y dentro de ella un arreglo o mapa con la pregunta y las respuestas.
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

5
Preguntas y respuestas / Re:La mejor manera de poner ese background?
« en: Agosto 30, 2017, 06:21:48 pm »
Sí, se reduce el número de cambios de textura.
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

6
Preguntas y respuestas / Re:Optimizar un Step
« en: Agosto 26, 2017, 03:28:47 pm »
La funciones distance_to_object y distance_to_point son lentas porque miden la distancia desde el borde de las máscaras de colisión, es mejor usar point_distance para tomar en cuenta solo los orígenes de coordenadas, sin embargo, la distancia obtenida será un poco mayor que con con las funciones anteriores (porque en esas funciones se resta la distancia del origen al borde).

No es necesario crear un nuevo objeto, mejor solo agrega la variable antes de point_distance
enemigo = instance_nearest(x,y,obj_Aliado);
if point_distance( enemigo.x, enemigo.y, x,y ) <= rango { //...

Lo anterior se podría optimizar agregando una variable que le indique a la instanca "enemigo" que no vuelva a ejecutar esa parte de código, porque el resultado ya se conoce con anticipación: la instancia más cercana es la misma que acaba de ejecutar el código.

También se podría cambiar el diseño de los niveles para evitar muchas instancias activas al mismo tiempo.
Los siguientes usuarios dieron las gracias a este tema: Seirlord_Games

Páginas: 1