
Hola a todos! Recientemente tuve unas vacaciones y tuve tiempo de programar con calma los proyectos de mi casa. Por lo tanto, quería hacer mi sencillo juego en línea en Rust. Más precisamente, un simple juego de disparos en 2D. Decidí hacer que la red formara parte primero, y allí ya se verá qué y cómo. Como el género involucra acción en todos los campos, decidí usar el protocolo UDP. Comenzó a diseñar la arquitectura de la parte de la red. Me di cuenta de que puedes ponerlo todo en una biblioteca separada. También cargué la biblioteca resultante en crates.io bajo la licencia MIT, porque: a) Entonces será más conveniente para mí conectarla desde allí a mis proyectos. b) Quizás sea útil para otra persona y traiga beneficios. Para más detalles, bienvenido a cat.
Referencias
->
Fuentes->
Biblioteca en crates.io->
DocumentaciónEjemplo de uso
Cliente
Servidor
Dispositivo interno
En general, si utilizo sockets UDP sin procesar en lugar de sockets UDP sin procesar para la parte de red de
Laminar , entonces el código podría reducirse en un factor de 100, y uso el algoritmo descrito en esta serie de artículos:
Programación de redes para desarrolladores de juegos .
La arquitectura del servidor implica recibir comandos de los clientes (por ejemplo, presionar un botón del mouse o algún botón del teclado) y enviarles un estado (por ejemplo, la posición actual de las unidades y la dirección que están mirando) con el que el cliente puede mostrar una imagen al jugador.
En el servidor
En el cliente
Epílogo
De hecho, fue más fácil hacer un algoritmo de entrega de comandos. En el servidor, acepte solo el paquete con el que va más que ir al último paquete recibido por +1, y descarte el resto. Envíe al cliente el último paquete recibido. En el cliente, guarde un caché de todos los comandos que el usuario intentó enviar al servidor. Cada vez que llega un nuevo estado del servidor con ID, el último paquete recibido por el servidor, lo elimina de la caché y todos los paquetes con ID menos de lo que tiene. Todos los paquetes restantes se envían nuevamente al servidor.
Además, cuando haga el juego en sí, en el proceso de uso mejoraré y optimizaré aún más la lib. Quizás encuentre algunos errores más.
Encontré aquí un proyecto de servidor de juegos en C # -
Networker + en Rust, hay una
hoja, algo así como un análogo de un servidor de juegos en Go - leaf. Solo hay desarrollo en progreso.
PD Estimado amigo, si eres un principiante y decidiste leer mi código para este proyecto y ver las pruebas que escribí allí. Así que aquí está mi consejo para ti: no hagas lo que yo hago. Mezclé todo en un montón en las pruebas y no seguí la plantilla "AAA" (google qué es). No tiene que hacer esto en producción. Una prueba normal debe verificar una cosa, no varias condiciones a la vez, y debe consistir en los pasos:
- Usted establece sus variables;
- Realizas la acción que quieres probar;
- Compara el resultado con el esperado.
Por ejemplo
fn add_one(x:usize) -> usize { x+1 } #[test] fn add_one_fn_should_add_one_to_it_argument(){ let x = 2; let expected = x+1;