Implementazione multigiocatore, posso implementarla in un secondo momento se ho scelto di farlo?


15

Ho intenzione di usare XNA per costruire un progetto di gioco. Non sono del tutto sicuro al momento se voglio aggiungere funzionalità multiplayer o meno, sopportando che ho molti altri problemi da risolvere in cui sono ancora nuovo. Non voglio che il progetto sfugga necessariamente di mano.

La mia domanda è: se vado nel mio progetto senza aver in programma di aggiungere il supporto multiplayer, è facile tornare indietro (di solito non lo è) e aggiungere il codice necessario per catturare un gioco multiplayer?

Risposte:


24

Ecco alcuni consigli sonori tratti dal manuale della libreria di rete Zoidcom :

Se il progetto è in fase di pianificazione, si consiglia di progettare il progetto per il networking fin dall'inizio. Il bullonaggio del codice di rete in uno stato tardivo del progetto molto probabilmente porterà a un massiccio refactoring o a una grande quantità di hacking, con conseguenti codici difficilmente mantenibili e corretti da bug.

Il modo più pulito è implementare l'intero gioco come se fosse un gioco di rete puro. Cioè, implementare il codice per un server dedicato e implementare questo codice solo come codice server. Implementa il codice client di gioco in modo simile. Server e client possono essere eseguiti nello stesso processo e non è nemmeno necessario utilizzare un socket di rete reale, ma devono essere entità separate e tutto il codice deve essere progettato per funzionare in questo modo. Quando il giocatore salta, non alterare direttamente il vettore di salto del giocatore, ma invia un pacchetto "premuto il tasto di salto" al server e lascia che il server lo gestisca.

Ciò significa che anche in una partita a giocatore singolo, c'è un server invisibile in esecuzione in background. Una versione multiplayer dello stesso gioco deve solo connettersi a un server remoto invece di quello locale e voilà, il multiplayer è fatto. I vantaggi di questo sono:

nessun codice separato per singolo e multiplayer il codice di rete viene testato e sviluppato durante l'intero codice di pulizia del progetto

I progetti che utilizzano questo schema sono quasi tutti i giochi che utilizzano uno dei motori di Quake, Civilization 4, Neverwinter Nights e molti altri.

Per connettere client e server nello stesso processo con latenza zero, è possibile utilizzare socket locali. Questi sono forniti da Zoidcom e passano i pacchetti direttamente da uno ZCom_Control a un altro, senza passare attraverso un socket a livello di sistema operativo.


Sembra che questo sia un setup per pura autorità del server che odio. Se il tuo ping al server è basso, funziona bene. Ma quando il ping diventa troppo alto, le azioni sullo schermo vengono ritardate. Preferisco di gran lunga il metodo utilizzato dal motore di origine, il client esegue la fisica e le cose localmente e qualsiasi azione viene immediatamente visualizzata, ma il server continua a controllarlo per assicurarsi che le persone non stiano hackerando, e se ci sono incoerenze in ciò che sarebbe dovuto accadere , il server invia lo stato corretto al lettore e sovrascrive la simulazione client con nuovi dati.
AttackingHobo

8
@AttackingHobo: stai solo descrivendo la previsione del cliente. Puoi avere la previsione del client e l'autorità del server insieme bene, e non preclude affatto l'architettura descritta nel manuale di Zoidcom.

@AttackingHobo @Joe: E Zoidcom in realtà supporta la previsione lato client ^^
Leftium

2

Sono d'accordo con il consiglio citato nella risposta di Leftium; progettalo per il networking fin dall'inizio, perché non potrai aggiungerlo in seguito .

La prima volta che ho provato a creare una partita multiplayer (non stavo nemmeno provando a creare una partita a giocatore singolo!), Ho pensato che avrei prima funzionato e poi aggiunto la rete. Cattiva idea. Mi è rimasto un prototipo di un gioco single player davvero noioso e non ho idea di come trasformarlo in un gioco multiplayer. L'ho eliminato del tutto e ricominciato, questa volta scrivendo il codice di rete multiplayer fin dall'inizio. Tutto cliccato.

Sono sicuro che non è impossibile iniziare con una partita a giocatore singolo e aggiungere funzionalità multiplayer. Se ci pensi, pianificalo correttamente e assicurati di conoscere la tua strategia, quindi provalo. Penso che sarebbe almeno un puzzle interessante da risolvere. Ma assicurati davvero di conoscere il tuo piano su come aggiungere la rete.

Penso che ci sia una via di mezzo (anche se non l'ho mai provato). Potresti scrivere alcune classi fittizie per le funzionalità di rete / multiplayer ed essere diligente nell'usarle mentre scrivi il gioco per giocatore singolo. Successivamente, se decidi di implementare il multiplayer, compila semplicemente le classi fittizie e sarai quasi completamente fatto. Questo si avvicina moltissimo al metodo server / client, ma potresti essere in grado di cavartela con meno lavoro; dopotutto, una partita a giocatore singolo è più facile da realizzare rispetto a una partita multiplayer, quindi se hai intenzione di scrivere la tua partita a giocatore singolo come una partita multiplayer, allora perché non renderla multiplayer?

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.