Devo scrivere il mio motore fisico, a causa dell'integrazione in rete?


11

Attualmente sto sviluppando uno sparatutto zombi top down, in tempo reale. Sto scrivendo questo codice in Java, usando JBox2D come mio motore fisico. Questa settimana ho codificato il networking e ora sono in sincronia con la fisica.

Sto pensando di utilizzare il modello predittivo client / server autorevole, in cui il client è libero di spostarsi, a condizione che il server lo approvi in ​​seguito. Ciò comporta che il client invii pacchetti contenenti dati di movimento al server e che il server calcoli la latenza e simuli nuovamente il mondo da uno stato precedente.

Il mio problema è che il mio attuale motore fisico, JBox2D (fondamentalmente una porta di Box2D), non supporta il rollback del mondo e apparentemente non è così facile serializzare i dati del mondo. Ho 2 soluzioni, potrei modificare / estendere il mio attuale motore fisico o scriverne uno mio.

Ragioni per scrivere il mio motore di fisica -

  • Posso rimuovere funzionalità non necessarie. In un gioco top down, ho davvero bisogno solo di meccaniche di collisione e forze di gestione. Nessuna gravità è coinvolta.
  • Riesco a capire meglio il codice e sarebbe [molto probabilmente] più semplice implementare le funzioni di rollback

Motivi per l'estensione / modifica di JBox2D

  • Scrivere il mio motore fisico sarebbe una notevole quantità di lavoro, che potrebbe essere ingombrante
  • JBox2D ha una community ampiamente supportata, che può aiutarmi con il mio sviluppatore
  • JBox2D, ha ottimizzazioni specifiche, per cose come il rilevamento delle collisioni, che lo rendono utile
  • Alcuni lavori sono già stati fatti su questo, ma è stato condiviso poco codice

Quindi quali sono le tue opinioni. Questo è il mio primo gioco e non sono assolutamente uno sviluppatore di giochi professionale. Se qualcuno potesse fornire alcuni link per il lavoro già svolto nell'area (preferibilmente usando JBox2D / Box2D / Java).


Inoltre, se usi JBox2D, dovrai utilizzarlo strictfpovunque, il che avrà un impatto grave sulle prestazioni. In caso contrario, il server e il client potrebbero non ottenere esattamente gli stessi risultati. Consiglierei invece di utilizzare il punto fisso.
Sam Hocevar,

Risposte:


7

Il rilevamento delle collisioni in 2D è così dannatamente semplice, non so perché dovresti addirittura preoccuparti di usare un motore fisico in primo luogo. E poiché tutte le forze di movimentazione sono dirette o su una curva (nessuna caduta, alterazione delle diagnosi ecc.) Personalmente per me è un gioco da ragazzi che dovresti scegliere. Creare il tuo è semplice. Collisione:

tenere conto delle 3 possibili collisioni che possono verificarsi in 2 rettangoli:

  1. Da bordo a bordo: abbastanza semplice, ottieni l'asse di un singolo bordo e un altro e decidi se occupano lo stesso spazio o abbastanza vicino ad esso.
  2. Da bordo a angolo: questo sarà facilmente il più comune se hai forme rotanti. Fortunatamente, è anche abbastanza semplice da implementare.
  3. Da angolo ad angolo: questo accadrà così raramente che non vale nemmeno la pena implementarlo. Il motivo è che 2 cose dovrebbero spostarsi esattamente in direzioni opposte sullo stesso asse esatto fino all'ultimo decimale calcolato dei motori. Ora, se tutto ruota di 45 o 90 gradi, questo MAGGIO (anche probabilmente probabilmente non) vale la pena includerlo

EDIT: Come commentato, ho molta meno familiarità con questa questione e non dovrei essere consultato sulla collisione proiettile / proiettile.

Quando ho lavorato con proiettili nello spazio 2D, ho usato una sorta di percorso che ha funzionato sia in linea retta che curva in cui avrei lanciato il proiettile usando il motore fisico (che non ho fatto da zero) e ho usato la collisione standard.

Leggi come costruirlo da zero nei commenti.


EDIT: * Fidati di me, * indipendentemente da quale, avrai bisogno di una sorta di resa dei conti nel tuo motore di gioco, a causa dei proiettili e di quanti proiettili potrebbero essere sullo schermo in un dato momento. ASSOLUTAMENTE non si desidera aggiornare ogni singolo proiettile sullo schermo per frame nella posizione indicata. Ma è un ottimo modo per rendere un gioco incredibilmente lento: D! Dovresti solo aggiornare queste cose:

  • Un proiettile viene lanciato
  • La direzione in cui viene lanciata
  • Che sia curvo o meno
    • E se è così, qual è la funzione della curva
  • Che proiettile è (Questo spiega la grafica, gli effetti, i danni, tutto)

Ora aggiorna i dati nel motore in base a tali dati, piuttosto che sul server per ogni dannato proiettile, e invia i dati dei pacchetti per ogni singolo proiettile. (Immagina di farlo con anche solo 2 mitragliatrici sullo schermo! Gesù!)


Naturalmente è relativamente facile da implementare, ma sono anche interessato all'ottimizzazione del rilevamento delle collisioni, che non ho idea di come implementare.
liamzebedee,

Il metodo che ho descritto in realtà non richiede ottimizzazione se lo fai come descritto. L'unica ottimizzazione che potrebbe essere necessaria è il tempo in cui si eseguono i controlli e la frequenza con cui le collisioni vengono effettivamente aggiornate. Ad esempio: devono davvero essere aggiornati solo quando esiste la possibilità di una collisione.
Joshua Hedges,

Espandere ciò che ho affermato l'ultima volta. Ad esempio, devi solo verificare la presenza di una collisione, quando il tuo personaggio si sta muovendo. Hai sempre e solo bisogno di controllare la collisione delle unità, quando hai anche unità in vista che non sono il tuo personaggio. Devi solo verificare la collisione dei proiettili, quando esistono (in quel momento). È possibile saltare qualsiasi forma di rilevamento del tipo di collisione (è da bordo a bordo? Angolo da bordo? Ecc.) Dopo aver saputo che qualcosa sta persino toccando qualcos'altro o vicino ad esso. Altrimenti, saltalo nel complesso.
Joshua Hedges,

Tranne quando sto elaborando le collisioni sul lato server, in cui devo rilevare le collisioni per più giocatori ecc.
liamzebedee,

4
@MadPumpkin: la tua fiducia eccessiva si riflette male sulla tua risposta; stai parlando di rilevare le collisioni, ma non menzioni il rilevamento delle collisioni di sweep che è il nucleo assoluto della corretta gestione dei proiettili in uno sparatutto 2D. Inoltre, anche con lo spazzamento, la risoluzione è tanto importante quanto il rilevamento, poiché è necessario decidere quale collisione si è verificata per prima, risolvere potenziali conflitti e forse riavviare l'intera risoluzione in caso di entità rimosse. Certamente non è la cosa banale che sembra insinuare che sia.
Sam Hocevar,
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.