Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Consejo sobre posición de personajes (multijugador)

Iniciado por yung, 10 de Diciembre de 2008, 10:30:44 AM

« anterior - próximo »

yung

Hola a todos.

Estoy haciendo un juego multijugador. El cliente es en flash y esta organizado por tiles, unos son de tipo suelo (el personaje puede pasar por encima) y otros de tipo pared (los personajes no pueden pasar por ellos).
Tengo tambien programado un servidor de sockets java que recibe las posiciones de cada cliente en un hilo y le envia todas las demas posiciones de los otros usuarios en esa pantalla. Luego el cliente se encarga de mover a los otros personajes. Hasta ahi lo tengo programado todo bien.

Los clientes flash envian sus coordenadas cada xxxx milisegundos al server, y cuando recibe las posiciones de los otros usuarios los mueve hacia su nueva posicion cada uno, desde la anterior. El problema que tengo es que lo hacen en linea recta (desde la antigua posicion hasta la nueva que envia el server), y claro, si existe un tile de tipo pared por medio pues pasa por encima cual fantasma.

¿me dais algun consejo sobre esto? Supongo que me vais a decir que estudie el pathfinding y tal, pero lo veo un poco complicado... ¿hay otra forma de hacer esto?


Agradeceria tambien si me dais alguna URL de tutoriales, webs o blogs que traten sobre el tema de multijugador o MMORPGs, me da igual que sean en ingles.

GRACIAS!  ;)

[EX3]

Cita de: yung en 10 de Diciembre de 2008, 10:30:44 AM
¿me dais algun consejo sobre esto? Supongo que me vais a decir que estudie el pathfinding y tal, pero lo veo un poco complicado... ¿hay otra forma de hacer esto?
Hombre, es que el pathfinding es la solucion para estos casos. No existen soluciones milagrosas ni sencillas :P En el foro han tratado mas de una vez el tema del pathfinding con algorritmos como el A* por ejemplo. Si buscas que tus personajes respeten el escenario a la hora de moverse no te queda otra.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

yung

me lo temia, jeje, gracias  de todos modos EX3,  pues me voy a revisar el A* que parece el algoritmo más 'simple', a ver si encuentro por ahi algun ejemplo para actionscript 3..

saludos!  :P

[EX3]

#3
En AS2 o quizas AS3 no me extrañaria que hasta encontraras una libreria de terceros que ya lo implementara :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

carlos

Y si en cada mensaje en vez de enviar sólo el tile actual envias todos los tiles por los que ha pasado el jugador desde el último mensaje? así puedes reconstruir todo el movimiento de cada jugador sin hacer pathfinding, claro que serán más datos a enviar. O también puedes enviar los movimientos que ha hecho desde el tile anterior, por ejemplo 3 tiles izquierda y 2 arriba, de esta manera ocupará menos.


[EX3]

Estoy poco espabilado hoy me temo. Carlos puede tener razon ya que seria mas logico pasar las posiciones de los tiles que recorren los clientes en local al servidor o host que calcular la ruta que no tiene por que ser la misma que recorre el cliente en local. Yo estaba pensando en npc's o similares, osea, personajes automatizados por el juego y aun asi este sistema tambien deberia valer. Al final seria simplemente encadenar movimientos y acciones, mucho mas facil que calcular rutas, pero eso si, tendrias que implementar un sistema de sincronizado para que no descuadren los movimientos y acciones de los diferentes clientes.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

yung

gracias por tu aporte, carlos, no se me habia ocurrido a mi .. ::) ,aunque como bien dices, son más datos a enviar, por lo que tendria que estudiar lo que supone este coste extra de trafico.

Por otro lado, ya habia visto por ahi un ejemplo de codigo para AS3 de A* (lo comparto para los futuros interesados en el tema:  http://www.sephiroth.it/weblog/archives/2003/09/a_pathfinder_for_flash.php , ver el wiki) , tampoco veo mucho problema que los personajes pasen por rutas distintas a las que realmente han pasado: si un tio esta jugando en Sevilla y otro en Salamanca nunca sabrán  el camino exacto del otro...

Aqui hay un ejemplo muy interesante: http://www.sephiroth.it/phpwiki/uploads/path.finder.swf

Realizaré pruebecillas con los dos métodos a ver cual interesa más.

saludos!

t-spy

A ver si consigo explicarme.

Imagino que cada personaje ocupará una celda (tile) y que se desplazará de uno a otro ¿no?. Imagino también que no querras que un personaje pase sobre otro.

Con estas premisas lo lógico es enviar solo la información del tile en el que estás y el que te dispones a ocupar. ¿La razón?. Que al mover un personaje cambias el mapa de celdas ocupadas con la nueva posición del resto de personajes, así que tienes que recalcular el camino para buscar la nueva ruta.

Lo óptimo es recalcular la ruta solo cuando encuentras un obstáculo. Para esto lo que se hace es calcular la ruta y comenzar el movimiento. Antes de cada desplazamiento preguntamos al servidor si la celda a la que nos dirigimos está ocupada. Si no es así nos desplazamos y marcamos la nueva posición como ocupada para el resto de personajes, liberando la posición que dejamos. Si está ocupada buscamos una nueva ruta y comenzamos desde cero.

En resumen, el proceso sería:

1 - Buscar ruta.
2 - Comprobar si la posición a ocupar esta libre. Si no lo esta pasar a 1.
3 - Marcar la nueva posición y desplazarnos, liberando la posición que dejamos.
4 - Pasar a 2.

Por supuesto, para buscar la nueva ruta tienes que usar algún algoritmo tipo A* o similar.

Espero que te sea útil.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.