
Olá pessoal! Recentemente, tirei férias e houve tempo para programar com calma meus projetos em casa. Eu queria, portanto, fazer meu jogo online simples no Rust. Mais precisamente, um simples jogo de tiro em 2D. Eu decidi fazer a parte da rede primeiro, e lá já será visto o que e como. Como o gênero envolve ação em todos os campos, decidi usar o protocolo UDP. Ele começou a projetar a arquitetura da parte da rede. Percebi que você pode colocar tudo em uma biblioteca separada. Também carreguei a biblioteca resultante no crates.io, sob a licença MIT, porque: a) Será mais conveniente conectá-la a partir daí aos meus projetos. b) Talvez seja útil para outra pessoa e traga benefícios. Para detalhes, bem-vindo ao gato.
Referências
->
Fontes->
Biblioteca em crates.io->
DocumentaçãoExemplo de uso
Cliente
Servidor
Dispositivo interno
Em geral, se eu usar soquetes UDP brutos em vez de soquetes UDP brutos para a parte de rede do
Laminar , o código poderá ser reduzido em um fator de 100 e usar o algoritmo descrito nesta série de artigos -
Programação de Rede para Desenvolvedores de Jogos .
A arquitetura do servidor envolve receber comandos dos clientes (por exemplo, pressionar um botão do mouse ou algum botão no teclado) e enviar a eles um estado (por exemplo, a posição atual das unidades e a direção que eles estão procurando) com os quais o cliente pode exibir uma imagem para o jogador.
No servidor
No cliente
Epílogo
De fato, era mais fácil criar um algoritmo de entrega de comandos. No servidor, aceite apenas o pacote com o qual vá mais do que o último pacote recebido por +1 e descarte o restante. Envie ao cliente o último pacote recebido. No cliente, mantenha um cache de todos os comandos que o usuário tentou enviar para o servidor. Sempre que um novo estado chegar do servidor com o ID, o último pacote recebido pelo servidor, exclua-o do cache e todos os pacotes com o ID menor que ele. Todos os pacotes restantes são enviados ao servidor novamente.
Além disso, quando eu criar o jogo em si, no processo de uso, melhorarei e otimizaremos a lib. Talvez eu encontre mais alguns bugs.
Eu encontrei aqui um projeto de servidor de jogos em C # -
Networker + on Rust, existe uma
folha, mais ou menos como um análogo de um servidor de jogos em Go - leaf. Só há desenvolvimento em andamento.
PS Caro amigo, se você é iniciante e decidiu ler meu código para este projeto e ver os testes que escrevi lá. Então, aqui está o meu conselho para você - não faça o que eu faço. Misturei tudo em uma pilha de testes e não segui o modelo "AAA" (pesquise no google o que é). Você não precisa fazer isso na produção. Um teste normal deve verificar uma coisa, não várias condições ao mesmo tempo, e deve consistir nas etapas:
- Você define suas variáveis;
- Você executa a ação que deseja testar;
- Você compara o resultado com o esperado.
Por exemplo
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;