Tutorial di Lennaerts su PHP, mysql e multiplayer

1

Index

Fichiers attachés

Les fichiers suivants ont été attachés à ce tutoriel:

Statistiques

8,224 visites, 19,308 vues

Outils

Partager

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

Published on 29 Nov, 2013. Last updated 25 Feb, 2019

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.

  • 0 Comments

Want to leave a comment? Login or Register an account!