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

Páginas: 1 2 3 4 5
46
Preguntas y respuestas / Re: Error ilógico (Esta vez bien XD)
« en: Febrero 09, 2011, 05:08:06 am »
También puedes mencionarnos el resto de la librerías DLLs que utilizas (Si es que las hay).

Me han tocado varios problemas similares... DLLs que funcionan bien en un equipo en otro lo hacen mal, esto es por depender directamente de servicios de Windows que podrían no estar bien instalados en cierto equipo.

¡Saludos!

47
En mi ejemplo de la sección descargas el while tiene la función de recoger datos más de una vez en un mismo step, while(1) es una ejecución infinita del bloque de código dentro, a menos que se cancele su ejecución usando break, al usar receivemessage() se devuelve el número de bytes recibidos, cuando el número de bytes es menor a 0 significa que no hay datos nuevos, así que se usa el break para cancelar la ejecución de todo el while en ese step, la ventaja que ofrece este método no es mucha, un juego puede funcionar perfectamente sin el.

En cuanto a lo de lag, hay que tomar en cuenta algunas cosas extra cuando se desea ampliar un juego online a más de 2 jugadores, recuerda que antes de recibir nuevos datos de otro socket se debe limpiar el buffer usando clearbuffer(), si no se hace se produce el efecto que mencionas.

Mi ejemplo ya esta viejo y debe ser actualizado, vengo diciendo esto más de año y no he hecho nada :-[, algún día estará listo... XD

Saludos :)

48
Para nada es una función pesada o que consuma muchos datos de Internet, en realidad solamente esta escuchando en el socket en busca de datos, tcpaccept() devuelve un valor positivo cuando encuentra datos de petición de conexión por parte de un "cliente".

Y si es necesario que se este ejecutando todo el tiempo, ya que no se sabe exactamente cuando un "cliente" le enviará esa petición para conectarse.

Saludos :)

50
Preguntas y respuestas / Re: GM8: Envío y llegada de datos en 39Dll
« en: Octubre 31, 2010, 09:29:51 am »
Como te dijo Texic, la mejor forma es usando bucles, si guardas los socket de cada jugador en un array podrías hacer así:

// Envío de mensaje TCP a todos los clientes
// global.socket = Contiene el socket asignado por la 39dll
// global.maxjugadores = El máximo de jugadores posibles (Debe ser constante, con esto me refiero a que es la capacidad máxima de jugadores en el juego, no los que están actualmente conectados)
// global.jugador_online = Valor booleano (0 o 1) que demuestra si el jugador esta conectado

var i;
for(i = 1; i <= global.maxjugadores; i += 1)
{
     if global.jugador_online[i]
     {
         sendmessage(global.socket[i])
     }
}

Siguiendo esa base puedes conseguir un online estable, para leer datos en el cliente no hay ningún problema, ya que se puede leer directo, pero para que el host lea los datos de todos los clientes, podría ser así:

// Recibe mensajes de los clientes
// global.socket = Contiene el socket asignado por la 39dll
// global.maxjugadores = El máximo de jugadores posibles (Debe ser constante, con esto me refiero a que es la capacidad máxima de jugadores en el juego, no los que están actualmente conectados)
// global.jugador_online = Valor booleano (0 o 1) que demuestra si el jugador esta conectado

var i;
for(i = 1; i <= global.maxjugadores; i += 1)
{
    if global.jugador_online[i]
    {
        if tcpconnected(global.socket[i])
        {
            clearbuffer()
            receivemessage(global.socket[i]
            /* Aquí continuar con la lectura de datos recibidos */
        }
    }
}

Saludos :)

52
Puedes hacer algo como esto:

switch(get_string("Inserta un texto",""))
{
  case "entrar": // Si se escribe "entrar" se ejecuta lo que esta dentro de {}
  {
    // Códigos si se escribió "entrar"
    break
  }
 
  case "salir": // Si se escribe "salir" se ejecuta lo que esta dentro de {}
  {
    // Códigos si se escribió "salir"
    break
  }
}

Saludos :)

53
Te dejo este script que hice y que cumple la función que necesitas:

get_number_ext()
Código: [Seleccionar]
// Define el número de archivos en un directorio con cierta extensión
//argument0: Directorio
//argument1: Extensión
//return: Número de archivos encontrados

var dir, ext, a, c;
dir = argument0
ext = argument1
c = 0
if string_copy(dir,string_length(dir),1) != '\' {dir += '\'}
if string_copy(ext,1,1) != '.' {ext = string_insert('.',ext,1)}
for(a = file_find_first(dir + '*' + ext,fa_archive); a != ''; a = file_find_next()) {if filename_ext(a) = ext {c += 1}}
return c

Obviamente si no hay ningún archivo .sav la función devuelve negativo, para hacer lo que pides sería:

Código: [Seleccionar]
if !get_number_ext(working_directory,'.sav') {/* Aqui el código */}

Saludos :)

54
Preguntas y respuestas / Re: Enviar un array como argumento a un script
« en: Agosto 03, 2010, 11:59:06 pm »
Es mejor utilizar listas directamente, cada una tiene un identificador propio, puedes organizar los datos dentro de estas, obtener el tamaño de la lista (número de registros), etc.

Tienes más información en el manual: http://www.comunidadgm.org/manual_GM/Listas.htm

Con las funciones que te muestra Texic se puede lograr un resultado similar al de las listas, sólo que el uso sería más complicado. Para hacer lo que pides basta con enviar el id de la lista previamente creada y dentro del script obtener los valores.

Saludos :)

55
Preguntas y respuestas / Re: Obtener nombre de windows
« en: Junio 29, 2010, 07:53:24 pm »
Tan simple como hacer una búsqueda en el registro de Windows, debería valer para todos los sistemas con kernel Windows NT

Código: [Seleccionar]
registry_set_root(1)
return registry_read_string_ext('\SOFTWARE\Microsoft\Windows NT\CurrentVersion','ProductName')

Saludos :)

56
Para iniciar cualquier juego creado en Game Maker 8 o inferiores no deberías tener ningún problema, sin embargo, es posible que posteriormente al inicio del juego te encuentres con algún error solamente si el juego utiliza Surfaces, debido a que para utilizarlas se necesita de más memoria de video, y he podido comprobar que estos errores ocurren usualmente con 128mb o menos.

Saludos

57
Preguntas y respuestas / Re: Compatibilidad gm8-gm7
« en: Marzo 20, 2010, 04:39:26 pm »
Una vez que el editable .gmk ha sido guardado en GM8 será imposible leerlo desde el GM7, saltará un mensaje de "Fue creado con una version más nueva"

Saludos

58
Preguntas y respuestas / Re: DLL GMRAR
« en: Febrero 28, 2010, 07:50:10 pm »
Ahí funciona bien el link, lo que pasa que con los cambios recientes en la comunidad la URL ya no era válida pues el link del sistema de descargas cambio

Recuerden que cuando algún post tiene algún link roto o algo mal se puede usar el link de Reportar al moderador y ya el staff se encargará de solucionarlo ;)

59
Preguntas y respuestas / Re: Saber IP con la 39dll
« en: Febrero 12, 2010, 04:51:51 am »
Pues mira, la 39dll trae una función para identificar tu dirección IP, pero al parecer no funciona tan bien como debería, el problema esta en que si tu cuentas con más de 1 dispositivo de red lo más probable es que te devuelva la dirección de otro dispositivo que no es el que tiene acceso a Internet o no es el que se esta usando para establecer esa conexión WinSock

La forma más efectiva de obtener tu dirección IP pública es a travez de PHP, leyendo los datos desde una web como http://www.whatismyip.org/ o fabricando tu propio script PHP que devuelva la IP. Para leerla desde una dirección web en Internet tienes que conectarte al puerto 80 de esa web o usar alguna DLL como Download Manager

Para obtener la dirección IP de los jugadores cliente es bastante más fácil, pues el servidor ya tiene las direcciones públicas almacenadas en cada socket, para obtenerlas usa la función tcpip(socket) . El argumento "socket" es el ID del socket del cliente del cual quieres obtener su dirección IP, este socket se obtiene al aceptar la conexión TCP con tcpaccept() y también es usado para recibir mensajes de los clientes, por lo que no creo que tengas problemas en identificar la variable en la que guardas el socket

P.D. Se ve bastante bien la imagen, suerte con el desarrollo ;)

60
Preguntas y respuestas / Re: Se pueden enviar strings con la 39dll??
« en: Febrero 05, 2010, 05:38:05 pm »
El nombre de las variables no importa, lo que si importa bastante es el orden que se sigue, un ejemplo sería de un código incorrecto:

Código: [Seleccionar]
// Lectura

writeshort(jugador)
writestring(nombre)

// Escritura

nombre = readstring()
jugador = readshort()

El problema aquí es que no se sigue el mismo orden, se envía un short y un string, y se lee primero el string y luego el short, el resultado de esto es un montón de datos incorrectos, pues esas funciones se basan en un valor X de bytes para saber hasta donde leer en el buffer

El modo correcto sería:

Código: [Seleccionar]
// Lectura

writeshort(jugador)
writestring(nombre)

// Escritura

jugador_x = readshort()
nombre_x = readstring()

En este caso los datos se enviarán y recibirán correctamente aunque los nombres de las variables sean distintos, en el caso del pong se usan los mismos nombres de variables para asignar directamente el valor a la variable deseada, como puede ser la posición x, y

Saludos

Páginas: 1 2 3 4 5