Colisões entre jogadores no jogo de corrida multiplayer

8

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.

Yozer
fonte
Seria possível aumentar o timestep no servidor para que haja pelo menos menos uma correção? Você tentou fazer com que os jogadores usassem os mesmos dados que o servidor possui (a última posição enviada e a posição preditiva dos outros jogadores)?
User3797758
Sugestão: Você tentou fazer apenas o servidor calcular a colisão? O cliente será usado apenas para renderizar e enviar / receber dados (e reagir a qualquer dado que tenha recebido, é claro).
Greffin28

Respostas:

1

Faça física apenas no servidor. Aqui está um exemplo de fluxo de trabalho:

  1. O cliente pressiona "orientar para a esquerda".
  2. O cliente envia uma solicitação de orientação à esquerda para o servidor
  3. Servidor recebe os dados.
  4. O servidor orienta a instância do cliente no servidor para a esquerda.
  5. O servidor detecta que há uma colisão entre jogadores.
  6. O servidor faz correções com base na colisão.
  7. O servidor envia dados de posição para o cliente.
  8. O cliente recebe os dados da posição.
  9. O cliente ajusta sua posição.
S. Tarık Çetin
fonte
0

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.

Andreas
fonte