Estou criando um jogo de corrida simples (naves espaciais, sem gravidade) usando p2.js, phaser e node.js.
O que eu fiz: O cliente recebe o estado do mundo do servidor:
- extrapolar outros jogadores com base na velocidade / posição mais recente do servidor
- verifique se a previsão do lado do cliente estava correta - se nenhuma posição de aplicação do servidor e as entradas do processo não estavam atentas.
- etapa fixa da física
Servidor:
- recebe insumos dos clientes e aplica
- etapa fixa da física
- envia estado mundial para cada cliente
Agora estou lutando com colisões entre jogadores. O jogador em colisão está pulando o tempo todo durante a colisão. Eu acho que é porque a previsão do lado do cliente não está calculando resultados semelhantes ao servidor.
O servidor não conhece todas as entradas do player (lag).
O jogador não tem a mesma posição de jogador em colisão que o servidor (lag).
A combinação desses dois fatores faz com que o cliente resolva uma colisão diferente do servidor e, quando o estado mundial chegar, o jogador precisará fazer uma grande correção.
Respostas:
Faça física apenas no servidor. Aqui está um exemplo de fluxo de trabalho:
fonte
Se você deseja que a interação do jogador pareça instantânea, existem algumas opções. Caso contrário, basta fazer física no lado do servidor.
Opção 1 : O lado do cliente detecta a colisão e os dados da colisão são enviados ao servidor e / ou diretamente para outro cliente. Certos atiradores multijogador realizam esse tipo de detecção de colisão porque, caso contrário, a mecânica do tiro não pareceria precisa.
Opção 2 : o lado do servidor faz física, mas faz muitas previsões diferentes. Você pode simplesmente usar mais instâncias de cada jogador e prever que eles façam coisas ligeiramente diferentes. Verifique se eles não colidem e enviam os dados aos clientes. Cada vez que o movimento do jogador corresponde a uma previsão, você usa os dados que já foram enviados ao cliente.
fonte