Si, hay que montar un sistema de cola de peticiones, es importante hacerlo para juegos medianamente grandes.
Para cuando algo jugable en red?
[GAME] Rosie ~ The Rascal
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
- SimulatorOne
- Posts: 6626
- Joined: Tue Nov 17, 2009 2:52 pm
- Location: Barcelona
- Contact:
Re: [GAME] Rosie ~ The Rascal
Pues te digo lo que funciona y lo que no Actualmente:
-Soporte multijugador 4 jugadores(4 clientes) (+ Servidor aparte,Jugador 0)
-Zona Multijuador de Espera "Lobby".
-Soporte de Nicks de nombre de jugador, 12 caracteres (pero aun no visible en los chats de los demas)
-Los jugadores pueden Elejir el Skin a gusto (pero aun no visible por los demas jugadores...)
-Soporte de CHAT hasta 48 Caracteres, multijugador (el Servidor tambien puede chatear) Funciona al 100%
-Sopprte para ver a otros jugadores moverse a tiempo real (lo mas rapio que pueden,dependiendo de la CPU y conexion ADSL)
Lo que aun no funciona,falla o falta por programar:
40%-Soporte de Skins que los Clientes sepan que Skin esta usando ese jugador.(de momento por nombre de skin)
20%-Mostrar nombre del Nick del jugador al chatear (de momento solo muestra el numero de ID jugador donde proviene el chat)
20%-Boton de Confirmar "Listo" para empezar a jugar a la siguiente Zona. (de momento se trata de un comando)
0%-Enviar a los demas Clientes "que cosas" han destruido/cogido : Anillos,Enemigos,Cabinas,Bloques...
-Soporte multijugador 4 jugadores(4 clientes) (+ Servidor aparte,Jugador 0)
-Zona Multijuador de Espera "Lobby".
-Soporte de Nicks de nombre de jugador, 12 caracteres (pero aun no visible en los chats de los demas)
-Los jugadores pueden Elejir el Skin a gusto (pero aun no visible por los demas jugadores...)
-Soporte de CHAT hasta 48 Caracteres, multijugador (el Servidor tambien puede chatear) Funciona al 100%
-Sopprte para ver a otros jugadores moverse a tiempo real (lo mas rapio que pueden,dependiendo de la CPU y conexion ADSL)
Lo que aun no funciona,falla o falta por programar:
40%-Soporte de Skins que los Clientes sepan que Skin esta usando ese jugador.(de momento por nombre de skin)
20%-Mostrar nombre del Nick del jugador al chatear (de momento solo muestra el numero de ID jugador donde proviene el chat)
20%-Boton de Confirmar "Listo" para empezar a jugar a la siguiente Zona. (de momento se trata de un comando)
0%-Enviar a los demas Clientes "que cosas" han destruido/cogido : Anillos,Enemigos,Cabinas,Bloques...
- BigHead
- Posts: 1277
- Joined: Sun Nov 30, 2008 1:28 pm
- Contact:
Re: [GAME] Rosie ~ The Rascal
Madremia simu akaba d salir el modulo d net hace na,vas muy bien!q ganas d probar esas fases online!!!enhorabuena. Q curro,animo q ya casi lo tienes,ahora faktamos el resto (menos erkos)q estamos a años luz d ti cn el online!
Hañime Bushi, nekonoashi
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
Re: [GAME] Rosie ~ The Rascal
Hombre Gracias, no es para tanto jeje..
http://iphonegamesdev.com/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
- SimulatorOne
- Posts: 6626
- Joined: Tue Nov 17, 2009 2:52 pm
- Location: Barcelona
- Contact:
Re: [GAME] Rosie ~ The Rascal
60%-Mostrar nombre del Nick del jugador al chatear...
casi lo tengo
solo debo solucionar un problemaa con el manejo de laa STRUCT.
por que entre clientes no se sabe que nombre,Skin tienen...
El servidor si que lo sabe.
pero ningun Cliente sabe naadaa de ningun otro cliente. solo saben las cordenadas,graph...
y debo recibir esa info de los clientes remotos...
creiaa que podiaa obtener esa info de los Clientes de maneraa directa sin pasar por el servidor.
Su historiaa comicaa: XDDD
Cliente 1: oie, Cliente 2 como te llamaas?
...
paasa un buen rato...
Cliente 2: no veo a nadie O_o¿ estoy solo???
...
Cliente 1: Me estoy haartaando de preguntarte como te llaamaaas?!!! Ò@Ó!!
Cliente 2: -_____- no me entero de naaaaaaaa.
XDDD
Pues ese el problema, el Cliente 2 nunca le llega ese mensaaje.
El servidor conoce a Todos.
Pero entre Clientes no se conocen....
El servidor, es el primero en llegar a la sala.
Entra el Cliente 1.
y el servidor dice: Hola! Como te llaamas
Cliente 1: me llamo Tino xDD
Servidor: Oks ^^ y como eres?
Cliente 1: pues soy rojo y negro te gustaa?
Servidor: mola, graaciaas, espera aqui aver si viene otro cliente.
(Servidor se guarda toda la info del Cliente 1)
....(El Servidor y Cliente 1 pueden hablarse sin problemas, enviando y recibiendo comandos entre si)
Cliente 2, Entra.
Servidor dice: Hola Cliente 2, Como te llamas?
Cliente 2: yo me llamo Raul
Servidor: y como eres?
Cliente 2: yo soy azul!
Servidor: vale, me alegro.
(Servidor se guarda la info del Cliente 2)
Cliente 1, se daa cuenta de que el Cliente 2 a entrado...
y le pregunta: Oie! Cliente 2, como te llamas?
Cliente 2: me parece que haay algien mas, pero no se nada de ese cliente le preguntare.
El Cliente 2, tambien le pregunta al Cliente 1, como se llama?
El servidor no se da cuenta de que hablan entre los 2, cree que estan en silencio.
Entre el Cliente 1 y 2, estan preguntando como se llaman...
pero .... ninguno responde...
y ninguno de los 2 se conoceran....
Y saben que estan los 2, solo que ninguno de ellos se comunican entre si.
esto viene de este problema: http://www.gemixstudio.com/forums/viewt ... 028#p44028
casi lo tengo
solo debo solucionar un problemaa con el manejo de laa STRUCT.
por que entre clientes no se sabe que nombre,Skin tienen...
El servidor si que lo sabe.
pero ningun Cliente sabe naadaa de ningun otro cliente. solo saben las cordenadas,graph...
y debo recibir esa info de los clientes remotos...
creiaa que podiaa obtener esa info de los Clientes de maneraa directa sin pasar por el servidor.
Su historiaa comicaa: XDDD
Cliente 1: oie, Cliente 2 como te llamaas?
...
paasa un buen rato...
Cliente 2: no veo a nadie O_o¿ estoy solo???
...
Cliente 1: Me estoy haartaando de preguntarte como te llaamaaas?!!! Ò@Ó!!
Cliente 2: -_____- no me entero de naaaaaaaa.
XDDD
Pues ese el problema, el Cliente 2 nunca le llega ese mensaaje.
El servidor conoce a Todos.
Pero entre Clientes no se conocen....
El servidor, es el primero en llegar a la sala.
Entra el Cliente 1.
y el servidor dice: Hola! Como te llaamas
Cliente 1: me llamo Tino xDD
Servidor: Oks ^^ y como eres?
Cliente 1: pues soy rojo y negro te gustaa?
Servidor: mola, graaciaas, espera aqui aver si viene otro cliente.
(Servidor se guarda toda la info del Cliente 1)
....(El Servidor y Cliente 1 pueden hablarse sin problemas, enviando y recibiendo comandos entre si)
Cliente 2, Entra.
Servidor dice: Hola Cliente 2, Como te llamas?
Cliente 2: yo me llamo Raul
Servidor: y como eres?
Cliente 2: yo soy azul!
Servidor: vale, me alegro.
(Servidor se guarda la info del Cliente 2)
Cliente 1, se daa cuenta de que el Cliente 2 a entrado...
y le pregunta: Oie! Cliente 2, como te llamas?
Cliente 2: me parece que haay algien mas, pero no se nada de ese cliente le preguntare.
El Cliente 2, tambien le pregunta al Cliente 1, como se llama?
El servidor no se da cuenta de que hablan entre los 2, cree que estan en silencio.
Entre el Cliente 1 y 2, estan preguntando como se llaman...
pero .... ninguno responde...
y ninguno de los 2 se conoceran....
Y saben que estan los 2, solo que ninguno de ellos se comunican entre si.
esto viene de este problema: http://www.gemixstudio.com/forums/viewt ... 028#p44028
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
Re: [GAME] Rosie ~ The Rascal
Haber, es bien sencillo mira:
Para que un cliente pueda hablar con otro cliente tienes 2 formas, por envíos al servidor con peticiones "cosa desaconsejada para tu tipo de juego.." o simplemente con un byte mas llamado por ejemplo: byte llamando_a_cliente_;
entonces, como hacer para que un cliente sepa que otro cliente le llama? así..
en cada cliente..
process controlador_eventos_entre_clientes_();
..
..
for( i=1; i<MaxConnections; i++ ) --> recorrer la lista de clientes conectados..
if(players.llamando_a_cliente_ == net.player_id) --> comprobar si otro cliente me llama a mi..
..
..
..
El tema protocolos a alto nivel es difícil Simulatorone, yo me atranco constantemente.. es algo que necesita ser preciso al 100%, sin posibilidad de error, y es algo a lo que no estamos acostumbrados XD.. a hacer algo "exacto".
Pues con algo así ya sabes cuando un cliente llama a otro cliente, solo es cuestión de pensarlo un poco y lo sacas, ahora le añades o reutilizas alguna variable tipo string para los mensajes y listos.
Para que un cliente pueda hablar con otro cliente tienes 2 formas, por envíos al servidor con peticiones "cosa desaconsejada para tu tipo de juego.." o simplemente con un byte mas llamado por ejemplo: byte llamando_a_cliente_;
entonces, como hacer para que un cliente sepa que otro cliente le llama? así..
en cada cliente..
process controlador_eventos_entre_clientes_();
..
..
for( i=1; i<MaxConnections; i++ ) --> recorrer la lista de clientes conectados..
if(players.llamando_a_cliente_ == net.player_id) --> comprobar si otro cliente me llama a mi..
..
..
..
El tema protocolos a alto nivel es difícil Simulatorone, yo me atranco constantemente.. es algo que necesita ser preciso al 100%, sin posibilidad de error, y es algo a lo que no estamos acostumbrados XD.. a hacer algo "exacto".
Pues con algo así ya sabes cuando un cliente llama a otro cliente, solo es cuestión de pensarlo un poco y lo sacas, ahora le añades o reutilizas alguna variable tipo string para los mensajes y listos.
http://iphonegamesdev.com/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
Re: [GAME] Rosie ~ The Rascal
Tienes que pensar de esta forna, no intentes pasarle un dato a otro cliente! solo grita su nombre y dile lo que quieres, como si fuera un perro!!
Si analizas bien lo de "dile lo que quieres" no me refiero a que le envies nada.. me refiero a que con una variable dices "oye pliente 1 escuchame!!" y con otra le dices "eres mas feo que un rábano!!", como ves, no has tocado los datos del cliente con el que quieres hablar, es el cliente mismo el que mira si alguien le dice algo, este es el funcionamiento mas básico de la comunicación a bajo nivel UDP broadcast, no conectas con nadie.. tu emites.. y el que lo oiga tiene que discriminar si es para el ese mensaje o no, y si es para el pues lo procesa.
Si analizas bien lo de "dile lo que quieres" no me refiero a que le envies nada.. me refiero a que con una variable dices "oye pliente 1 escuchame!!" y con otra le dices "eres mas feo que un rábano!!", como ves, no has tocado los datos del cliente con el que quieres hablar, es el cliente mismo el que mira si alguien le dice algo, este es el funcionamiento mas básico de la comunicación a bajo nivel UDP broadcast, no conectas con nadie.. tu emites.. y el que lo oiga tiene que discriminar si es para el ese mensaje o no, y si es para el pues lo procesa.
http://iphonegamesdev.com/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
- SimulatorOne
- Posts: 6626
- Joined: Tue Nov 17, 2009 2:52 pm
- Location: Barcelona
- Contact:
Re: [GAME] Rosie ~ The Rascal
es decir:
Cliente 1: Grita a si mismo, Cliente 2 como te llamas? (en su propia STRUCT registro net.id_player)
Cliente 2: pondra oido a todos los Clientes + Servidor, y se dara cuenta que el Cliente 1, le esta llamando y ademas le hace una peticion.
Cliente 2: Grita diciendo su nombre....
"Cliente 1, Me llamo Jorge"!
Cliente 1 esta atento poniendo odio, esta escuchando...
"Huy! el Cliente 2 me esta diciendome su nombre! biemmmm
"
Cliente 1, le dice Graciaas y adios al Cliente 2. (es para confirmar de que tiene su nombre)
el Cliente 2: De nada, adios.
xD
Creo que lo voy pillaando laa idea XDDD
hay que pensar en cosas sencillas, cosas de pura logica y muy muy social xDDD
Pues yo uso a comaandos directamente STRING, tengo 2:
Comandos de Cliente y Comandos de Servidor.
Los comandos cliente son para si mismo, o entre clientes
El Servidor miraa si algun cliente tiene algun comando de tipo Servidor.
Cliente 1: Grita a si mismo, Cliente 2 como te llamas? (en su propia STRUCT registro net.id_player)
Cliente 2: pondra oido a todos los Clientes + Servidor, y se dara cuenta que el Cliente 1, le esta llamando y ademas le hace una peticion.
Cliente 2: Grita diciendo su nombre....
"Cliente 1, Me llamo Jorge"!
Cliente 1 esta atento poniendo odio, esta escuchando...
"Huy! el Cliente 2 me esta diciendome su nombre! biemmmm
Cliente 1, le dice Graciaas y adios al Cliente 2. (es para confirmar de que tiene su nombre)
el Cliente 2: De nada, adios.
xD
Creo que lo voy pillaando laa idea XDDD
hay que pensar en cosas sencillas, cosas de pura logica y muy muy social xDDD
Pues yo uso a comaandos directamente STRING, tengo 2:
Comandos de Cliente y Comandos de Servidor.
Los comandos cliente son para si mismo, o entre clientes
El Servidor miraa si algun cliente tiene algun comando de tipo Servidor.
- erkosone
- Posts: 10656
- Joined: Tue Feb 24, 2009 2:13 pm
- Location: Barcelona.
- Contact:
Re: [GAME] Rosie ~ The Rascal
Exacto, esa es la idea, por ponerte un ejemplo de protocolo entre clientes por udp puro y duro..
cliente 1 pone esto en su registro y lo pasa a los demás..
byte destino_ = 2;
string comando = "como te llamas?";
todos los clientes están haciendo esto continuamente:
for( i=1; i<MaxConnections; i++ )
if(players.destino_ == net.player_id)
players[net.player_id].destino_ = 99; --> 99 indica estado de "mensaje recibido y procesando".. el player 1 verá este estado 99 y sabrá que su petición ha llegado a su destino..
..
..
.. procesar mensaje..
end
en el cliente 1 tras comprobar que el cliente al que ha llamado ha puesto su destino_ = 99 sabe que el mensaje ha llegado a su destino y esperará a que el cliente 2 le envié algo como esto:
"En el cliente 2 tras recibir la petición y poner su destino a 99"..
destino_ = 1;
mensaje_ "me llamo pepe";
En el cliente 1 otra vez..
si ve que ahora el cliente 2 le está enviando algo, procesa el mensaje del cliente 2 y vuelve a poner su estado destino_ a cero y su mensaje a "2.OK"..
En el cliente 2 de nuevo..
cuando vea que el cliente 1 ha puesto su destino_ = 0 y el mensaje a "cliente.OK" en este caso "2.OK" pues se pone en su estado inicial..
y vuelta a empezar..
Hay que mirarlo muy bien esto.. por que mientras se está produciendo una conversación lo mas probable es que otro cliente pregunte algo.. y puede liarse gorda.. por eso es bueno crear una variable mas que guarde algo como "ocupado.." y cuando quede libre esta variable se pueda procesar otro mensaje..
el tema tiene miga XD.-.
cliente 1 pone esto en su registro y lo pasa a los demás..
byte destino_ = 2;
string comando = "como te llamas?";
todos los clientes están haciendo esto continuamente:
for( i=1; i<MaxConnections; i++ )
if(players.destino_ == net.player_id)
players[net.player_id].destino_ = 99; --> 99 indica estado de "mensaje recibido y procesando".. el player 1 verá este estado 99 y sabrá que su petición ha llegado a su destino..
..
..
.. procesar mensaje..
end
en el cliente 1 tras comprobar que el cliente al que ha llamado ha puesto su destino_ = 99 sabe que el mensaje ha llegado a su destino y esperará a que el cliente 2 le envié algo como esto:
"En el cliente 2 tras recibir la petición y poner su destino a 99"..
destino_ = 1;
mensaje_ "me llamo pepe";
En el cliente 1 otra vez..
si ve que ahora el cliente 2 le está enviando algo, procesa el mensaje del cliente 2 y vuelve a poner su estado destino_ a cero y su mensaje a "2.OK"..
En el cliente 2 de nuevo..
cuando vea que el cliente 1 ha puesto su destino_ = 0 y el mensaje a "cliente.OK" en este caso "2.OK" pues se pone en su estado inicial..
y vuelta a empezar..
Hay que mirarlo muy bien esto.. por que mientras se está produciendo una conversación lo mas probable es que otro cliente pregunte algo.. y puede liarse gorda.. por eso es bueno crear una variable mas que guarde algo como "ocupado.." y cuando quede libre esta variable se pueda procesar otro mensaje..
el tema tiene miga XD.-.
http://iphonegamesdev.com/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
[GEMIX - VIDEO TUTORIALES] http://www.youtube.com/user/fasetconasa
http://gurugameprogramming.blogspot.com.es/
- SimulatorOne
- Posts: 6626
- Joined: Tue Nov 17, 2009 2:52 pm
- Location: Barcelona
- Contact:
Re: [GAME] Rosie ~ The Rascal
si lo entiendo totalmente,
por eso uso IF == 0 o "", antes de enviar nada por seguridad.
si no tiene ninguna operacion puede enviar un comando nuevo.
por eso seria bueno hacer un buffer de llamaadas.
y si uso un numero que identificaa QUIEN envia o recibe la peticion/comando.
La verdad tener el servidor me chiva de los sucesos y veo a tiempo real los comandos,
mola mucho
hay alguna cosa que necesito debugear, para ver realemente que valores trabajan.
Parece muy complejo, pero es divertido esto, pero taambien puede resultar frustrante.. pero aprendes mucho laa verdad.
por eso uso IF == 0 o "", antes de enviar nada por seguridad.
si no tiene ninguna operacion puede enviar un comando nuevo.
por eso seria bueno hacer un buffer de llamaadas.
y si uso un numero que identificaa QUIEN envia o recibe la peticion/comando.
La verdad tener el servidor me chiva de los sucesos y veo a tiempo real los comandos,
mola mucho
hay alguna cosa que necesito debugear, para ver realemente que valores trabajan.
Parece muy complejo, pero es divertido esto, pero taambien puede resultar frustrante.. pero aprendes mucho laa verdad.
![[RETO]: [MINI CONCURSO] Winter GAMES 2011 [JUEGO]: Rosie ~ The Rascal [RETO]: [MINI CONCURSO] Winter GAMES 2011 [JUEGO]: Rosie ~ The Rascal](../space/silver_medal.png)