È possibile implementare una modalità multiplayer in un classico arcade?
Sviluppare giochi d'azione multiplayer fluidi è sempre stato un po' sconcertante per me. Come dovrei dividere le responsabilità client-server e compensare le latenze di rete in modo che l'azione di gioco sembri istantanea? Volevo trovare delle risposte a queste domande.
Prenderemo il classico arcade del 1979 Asteroids e ne modificheremo un po' la premessa, in modo che diventi un deathmatch. Per ironia della sorte, salteremo gli omonimi asteroidi. Nel caso del nostro gioco, saranno sostituiti da altri giocatori.
Utilizzeremo Java 8, LibGDX come framework di gioco, Jackson per la serializzazione dei dati e implementazioni di Socket.IO per la comunicazione client-server.
Se non avete ancora familiarità con LibGDX vi incoraggio a fare il loro semplice tutorial di gioco prima di leggere oltre, e se questo vi ha interessato, immergetevi nell'eccellente Game Development with LibGDX di Udacity e How to Make a Platformer Game Using LibGDX.
Tutto ciò che costruiremo qui è disponibile come codice nel repository di riferimento. Si prega di notare che una parte del codice viene omessa in questa serie, quindi sarebbe meglio se lo teneste in una scheda da qualche parte.
LONELY IN THE UNIVERSE
Inizieremo con lo sviluppo di un gioco offline e lo miglioreremo con capacità multiplayer più tardi. In questa particolare parte, ci occuperemo di muovere una nave e sparare proiettili nel vuoto, e aggiungeremo un altro giocatore mockup in futuro.
Perciò, impostate un nuovo progetto LibGDX con solo il sottoprogetto Desktop e cominciamo a giocare.
Quando LibGDX ha finito di inizializzarsi, dovrete cambiare sourceCompatibility da 1.6 a 1.8 nei file build.gradle in entrambi i sottoprogetti desktop e core. Nota che se vuoi supportare le build HTML basate su Android e GWT devi usare al massimo la 1.7. Tuttavia, per questo tutorial, tutto ciò che ci interessa è il desktop. Trovo anche molto utili i lambda e i flussi introdotti nella 1.8 :).
Andate avanti e cancellate tutto quello che c'è dentro core/src/com/asteroids/game e inizieremo a sviluppare i pacchetti da zero. In questa parte, tutto il nostro sviluppo avverrà all'interno del sottoprogetto core.
Vuoi leggere di più con esempi di codice? Prova sul nostro blog:
Sviluppare un gioco multiplayer con compensazione del lag - parte 1 - offline
La prossima parte di cui avrai bisogno è impostare il server.
In base all'architettura client-server svilupperemo prima il server, poiché il client deve collegarsi a qualcosa. In poche parole, il server funzionerà a cicli: raccoglierà l'input dei controlli dai giocatori, eseguirà i calcoli della logica di gioco e infine rimanderà lo stato di gioco aggiornato ai client.
Da questa panoramica si possono trarre diversi punti chiave. I clienti invieranno solo l'input dei Controlli, non il loro stato di gioco. Questo elimina la necessità di convalida dello stato del client sul lato server (il client può solo dire "il mio tasto avanti è premuto", che è sempre una possibilità valida, piuttosto che "sono totalmente a [20x,30y]" anche se era [20x,5y] nell'ultimo frame). Questo a sua volta implica naturalmente che il server deve eseguire la logica di gioco per diventare un'unica fonte di verità.
Per rendere tutto ciò possibile i client e un server devono comunicare usando un formato comune e mantenere un canale bidirezionale veloce di scambio di messaggi. Devono anche avere un modo per identificare univocamente gli oggetti di gioco attraverso la barriera della rete, così quando il server dice "questo proiettile si è scontrato con questo giocatore" il client sa di quale proiettile e di quale giocatore si tratta. Sapendo questo, siamo pronti per implementare la nostra logica relativa al server.
CORSI INFRASTRUTTURALI
Ricordate che l'infrastruttura è già curata nel repository supplementare di questa serie di articoli alla parte 2: il server, quindi se state codificando insieme potete semplicemente cancellare tutto nel codice sorgente del modulo e avere un'infrastruttura pronta.
Ancora qui? Un piccolo testardo, vero? Ok, per prima cosa creeremo un modulo server nuovo di zecca, insieme ad altri moduli di primo livello (core, desktop ecc.). Sarà in qualche modo simile a un desktopmodule nel senso che è eseguibile, quindi possiamo semplicemente prendere build.gradle da desktop e regolare i nomi di conseguenza per il server. Poi creeremo il necessario src/com/asteroids/game/server/namespace all'interno. Poi dovremo tornare alla radice del progetto Asteroids dove includeremo il modulo server in settings.gradle, aggiungeremo le directory appropriate in .gitignore, e come ultimo passo banale, aggiungeremo i task per la nuova dichiarazione del progetto:
[di nuovo, esempi di codice visualizzati meglio sul nostro blog:]
http://www.schibsted.pl/blog/back-end/developing-lag-compensated-multiplayer-game-pt-2/
Articoli simili
- Sono davvero necessari 88 tasti per suonare pezzi di pianoforte classico?
- Perché il classico anime di fantascienza 'Akira', attualmente in streaming su Hulu, è considerato uno di quei film da vedere assolutamente?
- Qual è la combo Blitz di Sabin del classico Final Fantasy VI per PS1 su PlayStation Vita dal negozio di download?
- Quale gioco può battere la serie Breath of Fire, Golden Sun e il vecchio Final Fantasy (RPG classico)?