Ciao ragazzi, questo e' un tutorial per un multiplayer basato sul php, costruito da zero.
E' liberamente ispirato al mio gioco multiplayer di test TankWars.
Questo sistema funziona anche con CocoonJS dato che sono semplici richieste ajax.
Sono solo 26 eventi ^_^
Controllate il Capx per dettagli sugli eventi.
Qui c'è una demo funzionante fatta con questo tutorial
Quando entrate nel gioco, un codice sessione utente viene legato al browser dell'utente per l'identificazione. (questo vuol dire che un codice univoco viene memorizzato nel webstorage)
I file PHP sono inclusi nel CAPX
Necessari:
Un host con PHP (qualsiasi versione di PHP funzionerà, con supporto di mysql)
Un database mysql con permessi di accesso.
Il flusso generale di informazioni e' il seguente:
Flusso di dati.
Inizio del layout:
Sono richiesti dati sui giocatori attivi e le posizioni;
i giocatori sono messi in posizione;
vengono richiesti aggiornamenti sulle posizioni dei giocatori e ripetute non appena processate;
gli aggiornamenti contengono informazioni sui giocatori, colpi sparati, messaggi del gioco e stato dei giocatori;
i colpi sparati dai giocatori inviano il loro post;
i nemici uccisi inviano anche loro la propria richiesta, ma il giocatore non risulta ucciso fino al prossimo update ricevuto da construct 2 dal database;
Fondamentalmente e' tutto qui: hai posizioni ed hanno bisogno di update.
Oltre questo ci saranno alcune attività estra, tipo gli spari e la morte dei giocatori.
Per poter tenere tutto questo rapido e tenere la sincronizzazione con altri giocatori il piu' veloce possibile è necessario tenere alcuni fattori in mente:
Velocità: se le cose si muovono troppo in fretta, ai giocatori sembrerà di fare dei grandi salti dopo un update, quindi tenete le velocità basse in maniera che la differenza non diventi fastidiosa. Ovviamente possiamo aggiungere ad un update alcuni Lerp o effetti di movimento, ma ho realizzato che i movimenti animati sarebbero fatti quando il giocatore ha già fatto un movimento, rendendolo quindi meno realistico. Per questo, update istantanei.
Richieste: ovviamente si possono fare richieste per ogni azione, come movimenti e spari, ma questo rallenterebbe la velocità delle richieste, dato che vengono eseguite una per volta. Per aggirare questo problema, inseriremo piu' informazioni possibili in una richiesta e limiteremo il piu' possibile il numero di richieste post di Ajax.
Preparazione dei Layout del gioco.
Utilizzo 2 layots per gli elementi del gioco, il gamelayout e objectslayout.
Nell'objectlayouts memorizzo tutti i miei oggetti che non sono necessari per il caricamento del gioco. Questo ha un sacco di vantaggi che andro' a spiegare tra poco.
Le cose indispensabili che andro' ad utilizzare sono:
GameLayout:
Quadrati blu (spawnpoint): questi diventeranno punti di spawn; è fondamentalmente un oggetto copiato/incollato 4 volte in quattro punti della mappa;
Quadrato nero (playerbase): questa è la base del giocatore attivo, e tutti i movimenti saranno diretti attraveso questa;
Triangolo (player): questa è la rappresentazione del giocatore.
Caselle di testo in cima: 1 per ogni quanto spesso il giocatore viene ucciso, 1 per le uccisioni, 1 per i messaggi del gioco.
ObjectsLayout:
Triangolo (enemy): questo è un clone del giocatore, ma un oggetto diverso con il proprio nome;
Esplosione (explosion): useremo un'esplosione per le morti;
Bullet1: Proiettili sparati dal giocaore;
Bullet2: Proiettili sparati dall'avversario;
C'e' bisogno di avere due proiettili separati che fanno circa la stessa cosa, in maniera da rendere piu' semplici alcune meccaniche per il multiplayer.
Di questi oggetti solo il triangolo nemico ha bisogno di piu' di una variabile di istanza.
Ciascuno dei due oggetti proiettile richiede la variabile di istanza "shooter" che indica chi spara il proiettile.
Ho dato all'esplosione un effetto di scomparsa di valore 0.5 secondi dopo i quali l'oggetto esplosione viene distrutto.
Il testo del messaggio riceve un fade effect, ma non viene distrutto dopo il termine dell'effetto.
Il testo con le morti procurate e le morti subite resta semplice.
Fondamentalmente il layout e' tutto qui, semplice e lineare.
Nella prossima pagina, configuriamo il nostro database.