Comunidad de diseño web y desarrollo en internet online

Multiuser basado en Tiles

Citar            
MensajeEscrito el 15 Jul 2009 05:23 pm
Hola!!
Buenas a todos, es la primera vez que escribo en este foro, aunque llevaba visitándolo un tiempo...
Estoy haciendo un chat virtual con avatares, basado en el tutorial de Tonypa. Mi duda es simple: ¿es bueno ir mandando cada vez al servidor la posición _x e _y del avatar que se está moviendo? He pensado que eso a la larga puede traer muchos problemas, porque si hay muchas conexiones......!!!
Si no: ¿qué otras alternativas hay?
¡GRACIAS! ¡Y saludos!

Por Sluggy

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Jul 2009 12:46 pm
La alternativa es mandar dirección y velocidad, desarrollando la lógica del movimiento solo en el cliente. Luego solo se envía info en el caso de que alguno de los parámetros cambie

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Jul 2009 08:31 pm
Solisarg, gracias por tu ayuda. Lo he probado (la velocidad no porque es igual por defecto, pero si la dirección en X y en Y, 0 ó 1). Lo que hago es: un tío se mueve, imaginemos que dx=1, dy=0. Empieza a moverse y todo muy bien, hay un action que se ejecuta onClipEvent(enterFrame) y que multiplica dx y dy por la velocidad y va acualizando la posición. Pero luego imaginemos que gira, y ahora estamos en dx=0, dy=1. Como a los clientes les puede llegar la info con un poco de retraso, o simplemente han tenido más FPS y por lo tanto han ejecutado más la función que mueve al usuario, pues cuando gira, igual el avatar ya se ha pasado, y comienza a girar más tarde que debería (y cuando está por ejemplo en una pared) y luego cuando para, pues nada, al final ha ido torciendo según debía pero ha llegado a un sitio completamente diferente al que debería...

Espero haberme explicado :(
¡Gracias!

Por Sluggy

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 Jul 2009 08:36 pm
Usualmente los juegos de acción realtime no son los mas adecuados para jugarse multiusuario por Internet.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Jul 2009 09:06 pm
Solisarg, no es juego de acción ni nada, son pruebas... de hecho actualmente no son más que cuadraditos en un mapa bidimensional hecho por tiles... Vamos que existen unos cuantos juegos de ese estilo completamente funcionales y hechos en Flash (HabboHotel, Mokitown,...)

Pero bueno, mi duda es la del último post, por culpa de que en algunos casos se ejecuta más veces (por lo que sea) en el cliente la función de enterFrame que se encarga de ir sumando a la posición actual el producto de velocidad por dirección, el avatar aparece más lejos de lo que debería. Si para llegar a un sitio la función debería ejecutarse 12 veces, como hace en el cliente que 'manda la señal', y por lo que sea la última señal (que es la de STOP) llega a algún cliente por ejemplo medio segundo después, a éste en ese medio segundo le habrá dado tiempo de ejecutar la función para moverse unas 6 veces, y por lo tanto acabará más lejos de lo que debería, ¿me explico? Espero que sí :S

¡Gracias de nuevo! (sobre todo a tí, Solisarg)

Por Sluggy

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Jul 2009 12:17 am

Por Sluggy

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Jul 2009 12:43 am
Quizá cometí un error en mi tercer post en este tema diciendo lo de HabboHotel, porque alguno puede pensar que m idea es hacer un HabboHotel o algo así, y eso (coincido con todos) es soñar despierto (a no ser que tengas mucho dinero para contratar programadores, pixelartists, etc...) Yo sólo estoy pensando en hacer un chat un poco animado para una web que ya tiene servidor propio y de hecho su chat es en flash y con Palabre, pero ya que está montado el Palabre, hay servidor, etcétera... me he 'aventurado' a hacer algo más decente y de paso amortizar más lo que se está pagando por el servidor, porque a fin de cuentas chats decentes se pueden hacer con AJAX y PHP.
Gracias y lo siento ;)

Por Sluggy

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Jul 2009 07:00 pm
Palabre está bien, tu sigue adelante

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 Jul 2009 10:29 pm
Jorge: pero estoy bloqueado, por eso planteo la duda...
Lo voy a esquematizar al máximo:
1.- Tengo un array con todos los usuarios que están en movimiento en ese momento.
2.- Hay una función que se ejecuta onClipEvent(enterFrame), que hace un while con cada entrada del array, y dentro del while se multiplica la velocidad * dirección del avatar, y el resultado se le suma a la posición actual del avatar, para ir moviéndolo.
3.- Cuando un usuario ha llegado a su destino, manda al servidor un 'stop', que todos reciben y así automáticamente cada cliente borra al usuario del array con los users en movimiento, para que la siguiente vez que se haga el punto 2, ese avatar ya no se mueva.
-------- El PROBLEMA:
A algunos usuarios el 'stop' le llega más tarde (o simplemente tienen más FPS y por lo tanto enterFrame se ejecuta más veces), y entonces tardan más en borrar del array ese usuario que ha mandado el 'stop', y por lo tanto éste se mueve más de lo debido (porque sigue en el array), el caso es que termina un poquito (o bastante, en algunos casos) más lejos de lo que debería.

¿Alguien se ha enfrentado alguna vez a algo parecido? ¿por dónde sigo?

Por Sluggy

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Jul 2009 10:54 am
No estás bloqueado, simplemente frente a un hecho que cualquier desarrollador de juegos multiusuario observa antes de ponerse a armar algo del estilo:

- Con una latencia mayor a 10 ms puede haber algun desfasaje, con más de 100 seguro que lo habrá
- Más del 50% de tu posible audiencia no cumplirá con la velocidad mínima ... al menos puedes avisarles (test de velocidad al conectarse)
- Un juego de ajedrez, avanzar por turnos, juego de rol o similar puede llegar a funcionar
- Un juego de lucha y disparos seguramente no
- ¿Cuanto puedes adelantarte al movimiento del otro a partir de pocos datos? He ahí la clave del misterio

En sintesis, no es un problema, es una limitación del medio

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 Jul 2009 09:56 pm
Ok, quizá sea una limitación del medio, el caso es que necesita una solución, y eso es lo que busco, ayuda para llegar a esa solución. No puedo pedir al cliente que contrate más velocidad a internet, tampoco es cuestión de decirle que haga un test de velocidad y dependiendo de los resultados veremos si le dejamos pasar.
Hay que saber convivir con eso, como hacen la mayoría de los juegos de rol (clubPenguin, etc, y en cuanto a Tiles más concretamente, HabboHotel, MokiTown...) la cuestión es: ¿cómo? ¿Cómo consiguen ellos que no suceda lo que digo en el anterior post? Incluso teniendo un súper-servidor (que lo tienen) no conseguirían que todo el mundo recibiese la nueva información del movimiento en el momento justo (que es cuando el avatar ha llegado al centro del tile), porque este problema de que uno de los avatares pueda 'pasarse' de su destino no es tan sólo cosa del cliente, también del servidor (y me remito a mis anteriores post, donde creo que lo explico). Entonces: ¿qué han hecho estos juegos en su AS para conseguir que todo vaya perfecto, tanto como si se mandara cada vez _x e _y (pero sin mandarlo, lógicamente)?
Será alguna idea, de meter una variable más que se haga false cuando no sé qué y así el objeto deje de moverse, o algo así. Pero es que a mí no se me ocurre.
¡Saludos!

Por Sluggy

4 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.