UpdatePlayerPositions e pacchetti di dati
Il prossimo argomento puo' non essere cosi' avanzato, ma la difficolta' si nasconde proprio nel realizzare la compattezza dei dati e come effettuare le iterazioni.
Inoltre, il pezzo sucessivo di PHP include gia' il ritorno a Construct 2 dei dati e dei colpi sparati. Tuttavia, non abbiamo ancora nessun dato.
Se guardiamo l'ultima azione di richiesta sul checkplayer, si puo' vedere come abbiamo chiamato direttamente la funzione di richiesta, passando come parametro "updateplayerpositions", combinata con i dati, seguito dal nostro CheckCode.
Il secondo parametro è cruciale:
int(playerbase.X) & "-"& int(playerbase.Y) &"-"& int(playerbase.Angle)&"-"&player.unitid
una volta composto, dovrebbe assomigliare ad un qualcosa tipo 50-100-0-1 (x-y-angle-database_ref_id)
In PHP estrapoliamo questi valori con explode! Esatto! ... no, non vuol dire che esplodera'!
Se faccio:
$locs = explode("-", $_POST[extra]);
la variabile $locs dara' i seguenti risultati:
$locs[0] == 50 x
$locs[1] == 100 y
$locs[2] == 0 angle
$locs[3] == ID
questa tecnica e' applicata con i vari blocchi di dati quando vengono inviate le informazioni al file php in un parametro; in questa maniera si compattano le informazioni e si fa il post di meno variabili, tenendo il tutto relativamente semplice.
Quando PHP restituisce indietro qualcosa di simile, la stringa sara' di questo tipo:
50[]100[]0[]1[-]
I separatori sono le parentesi quadre [] ed il segno meno tra parentesi quadre [-] indica la fine di quell'insieme di stringhe.
Quindi potrete avere una stringa tipo:
data1|data2-1-1[]data2-1-2[-]data2-2-1[]data2-2-2[-]|data3|data4
La parte in grassetto mostra due insiemi piu' piccoli di pacchetti di dati.
Qui c'e' il core; non e' il massimo dell'eleganza, ma ho scritto tutto in codice procedurale, in maniera che tutti quelli che conoscono un minimo di programmazione possano capire.
if($_POST[request] == "updateplayerpositions"){
// Cominciamo a costruire la nostra stringa di risposta
$message = "updateplayerspositions|";
// Esplode le variabili dal post per ricevere x, y, l'angolo e l'ID
$locs = explode("-", $_POST[extra]);
// Un po' di semplice pulizia
$_POST[code] == stripslashes(mysql_real_escape_string($_POST[code]));
// Cancelliamo le informazioni sui messaggi e sui proiettili sparati che siano piu' vecchie degli 8 secondi precedenti, in quanto questo e' l'intervallo che abbiamo preso per la sincronizzazione
// Questo valore puo' essere piu' basso, ma dai miei test sembra un buon valore per cominciare
mysql_query("delete from shotsfired where stamped < DATE_SUB( NOW(), INTERVAL 8 SECOND)");
mysql_query("delete from messages where stamped < DATE_SUB( NOW(), INTERVAL 8 SECOND)");
// Successivamente facciamo l'update delle informazioni del nostro giocatore, basandoci sulle informazioni che abbiamo ricavato prima
mysql_query("update players set locx='$locs[0]', locy='$locs[1]',playerangle='$locs[2]' where id='$locs[3]' and playercode='$_POST[code]'"); //double check on the id and code
// Cicla su tutti i giocatori eccetto te stesso e costruisce la stringa di risposta
$playersquery = mysql_query("select * from players where id != '$locs[3]'");
while($playerstates = mysql_fetch_array($playersquery)){
$message .= $playerstates[locx]."[]".$playerstates[locy]."[]".$playerstates[playerangle]."[]".$playerstates[id]."[]".$playerstates[playercode]."[]".$playerstates[state]."[-]";
echo mysql_error();
}
// Aggiungiamo il nostro return code
$message .= "|".$_POST[code];
// Di seguito l'insieme di dati dei colpi sparati, che devono anch'essi essere restituiti, se ce ne sono.
$message .="|gameshots|"; // Indica l'inizio della stringa con i colpi sparati.
// Controlla se ci siano da processare colpi sparati per il nostro giocatore (colpi sparati dai nemici)
if(mysql_num_rows(mysql_query("select * from shotsfired where playercodes ='$_POST[code]'")) > 0 ){
// Se ci fossero colpi, cicla su tutti loro e costruisce la stringa
$query = mysql_query("select * from shotsfired where playercodes ='$_POST[code]'");
while($results = mysql_fetch_array($query)){
$message .= $results[shooter]."[]".$results[angle]."[-]"; // Chi ha sparato e con quale angolo
mysql_query("delete from shotsfired where id='$results[id]'"); // Non appena l'abbiamo aggiunto sulla stringa, va cancellato dalla lista
}
}
// Recupera alcuni dati del nostro giocatore
$playerdata = mysql_fetch_object(mysql_query("select * from players where id ='$locs[3]]'"));
// Verifica che il nostro giocatore sia ancora vivo
if($playerdata->state == "yes"){
$message .= "|died"; // Nada, morto
} else {
$message .= "|alive"; // Si, ancora vivo
}
// Aggiungiamo le nostre uccisioni e morti alla stringa
$message.= "|".$playerdata->kills."|".$playerdata->killed."|";
// Aggiungiamo eventuali messaggi per noi, se ce ne sono
$qmessages = mysql_query("select * from messages where playercodes='$_POST[code]' limit 1");
if(mysql_num_rows($qmessages) > 0) {
// Un piccolo trucco per aggiungere il contatore di messaggi
$xs = 0;
while($rmessages = mysql_fetch_array($qmessages)){
if($xs==0) {
$message .= "messages|"; // Questo dovrebbe essere aggiunto solo una volta
$xs = 1;
}
$message .= $rmessages['message']; // Messaggio aggiunto alla stringa
}
// Cancelliamo tutti i messaggi; se ce ne e' piu' di uno, vuol dire che sono comunque troppo vecchi e contengono informazioni obsolete
mysql_query("delete from messages where playercodes='$_POST[code]'");
$message .= "|";
}
}
Pfew... vi state spaccando la testa? Non ancora? Ottimo! Avanti allora!
Nella prossima parte faremo lavorare gli elementi di gioco con le stringhe ritornate qui sopra.