Collisioni tra giocatori nel gioco di corse multiplayer


8

Sto creando un semplice gioco di corse (astronavi, senza gravità) usando p2.js, phaser e node.js.

Cosa ho fatto: il client riceve lo stato mondiale dal server:

  • estrapolare altri giocatori in base all'ultima velocità / posizione dal server
  • controlla se la previsione sul lato client era corretta - se nessuna posizione applicabile dal server ed elabora input di cui il server non era a conoscenza.
  • passo di fisica fissa

Server:

  • riceve input dai client e si applica
  • passo di fisica fissa
  • invia lo stato mondiale a ciascun client

Ora sto lottando con le collisioni tra i giocatori. Il giocatore in collisione sta saltando tutto il tempo durante la collisione. Penso che sia perché la previsione sul lato client non sta calcolando risultati simili al server.

Il server non conosce tutti gli input dal player (ritardo).

Il giocatore non ha la stessa posizione di giocatore in collisione del server (ritardo).

La combinazione di questi due rende il client in grado di risolvere la collisione in modo diverso rispetto al server e quando arriva lo stato del mondo il giocatore deve apportare una grande correzione.


Sarebbe possibile aumentare il timestep sul server in modo che ci sia almeno meno di una correzione? Hai provato a fare in modo che i giocatori utilizzino gli stessi dati del server (l'ultima posizione inviata e la posizione predittiva degli altri giocatori)?
user3797758

Suggerimento: hai provato a fare in modo che solo il server calcoli la collisione? Il client verrà utilizzato solo per il rendering e l'invio / la ricezione di dati (e naturalmente per reagire a qualsiasi dato ricevuto).
Greffin28,

Risposte:


1

Fai la fisica solo sul server. Ecco un flusso di lavoro di esempio:

  1. Il cliente preme "mantieni la sinistra".
  2. Il client invia la richiesta "mantieni la sinistra" al server
  3. Il server riceve i dati.
  4. Il server dirige l'istanza del client sul server a sinistra.
  5. Il server rileva una collisione tra i giocatori.
  6. Il server apporta correzioni in base alla collisione.
  7. Il server invia i dati di posizione al client.
  8. Il cliente riceve i dati di posizione.
  9. Il cliente regola la sua posizione.

0

Se vuoi che l'interazione del giocatore si senta istantanea, ci sono alcune scelte. In caso contrario, fai semplicemente la fisica sul lato server.

Opzione 1 : il lato client rileva i dati di collisione e di collisione inviati al server e / o direttamente ad altri client. Alcuni tiratori multiplayer effettuano questo tipo di rilevamento delle collisioni perché altrimenti i meccanismi di tiro non sarebbero accurati.

Opzione 2 : lato server fa fisica, ma fa molte previsioni diverse. Puoi semplicemente usare più istanze di ciascun giocatore e prevederle per fare cose leggermente diverse. Assicurarsi che non si scontrino da soli e inviare i dati ai client. Ogni volta che il movimento del giocatore corrisponde a una previsione, si utilizzano i dati che sono già stati inviati al client.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.