Come risolvere in modo efficiente i giocatori / oggetti "vicini" in un gioco online senza iterarli attraverso tutti?

0

Ho un server di gioco online che funziona come segue:

  1. Una volta che un giocatore si è connesso, si trova in una delle sessioni predefinite (considerale posizione fisica, ad esempio Isola, posizione sotterranea, ecc.).
  2. Quindi qualsiasi azione (movimento, attacco) viene sempre trasmessa a tutti gli altri giocatori nella stessa sessione. Inoltre, quando partecipa a una sessione, tutti gli oggetti lasciati in quella sessione vengono inviati a lui, così come i giocatori che si trovano lì.

Questo è semplice e facile, ma nel client, il concetto di dividere il gioco in luoghi sta rovinando l'esperienza di "un mondo", se sai cosa intendo. Sto cercando di capire come trasmettere sempre / ricevere dati solo su oggetti che sono abbastanza vicini, ma mi rendo conto che iterare attraverso tutti i giocatori / elementi ogni volta e confrontare la distanza sarebbe un'assurdità.

C'è qualche approccio standard che potrei usare?

    
posta John V 05.09.2018 - 16:42
fonte

1 risposta

5

L'approccio standard è dividere il tuo mondo in grandi quadrati / cubi e tenere traccia di ogni giocatore.

Puoi quindi scorrere i giocatori nella casella in cui si trova il giocatore, piuttosto che tutti i giocatori del mondo.

Il problema si avvicina ai bordi del quadrato. Qui è necessario controllare i quadrati adiacenti. Ci sono alcuni trucchi intelligenti in cui hai due griglie sovrapposte di quadrati se devi ottimizzare.

Le scatole sono efficienti perché i tuoi giocatori / oggetti avranno coordinate x, y (, z). Un semplice confronto è tutto ciò che è necessario sapere quando si spostano da una casella a un'altra.

Se necessario, una volta ottenuto l'elenco dei giocatori "nelle vicinanze", puoi calcolare la distanza effettiva tra i giocatori e escludere quelli "ad angolo"

Ecco un buon articolo sull'argomento:

link

Ad esempio un approccio semplicistico

List<Square> squares

class Square
{
    public int x; //grid position of square
    public int y; //grid position of square
    public double top; //game world limits of square
    public double bottom;
    public double left;
    public double right;
    List<Player> Players // players in the square
}

Player.Update()
{
    if(position.x > mySquare.right) { //move to next square }
}

Game.FindNearbyPlayers
{
    var players = player.MySquare.Players()
    players.AddRange(getSquareByLocation(player.MySquare.x -1, player.MySquare.y))... etc
}

Devo notare che se stai usando un motore di gioco probabilmente avrà alcuni modi per cercare nel mondo di gioco in modo efficiente.

    
risposta data 05.09.2018 - 17:37
fonte

Leggi altre domande sui tag