20-01-2008, 12:15 PM
(Modification du message : 09-09-2008, 11:16 AM par Sephi-Chan.)
Ce tutorial est destinée à montrer une application plus poussée de la POO, et de certains design patterns.
Prérequis : Je recommande avant lecture d'avoir parcouru les tutoriaux POO et Singleton pour comprendre la PPO et l'utilisation d'élément statiques pour une classe.
Objectif : Dans un jeu où les différents éléments sont gérés par des classes, on souhaite pouvoir accéder aux éléments propres au joueur facilement, tout en évitant des requêtes inutiles et de devoir faire des classes différentes pour ce qui appartient au joueur et les autres.
Contexte : Un joueur se trouve dans une zone située dans une région. Ces éléments ne sont pas susceptibles de changer en dehors d'une action du joueur.
Présentation de la classe CharacterManager
Cette classe sert à gérer un joueur quelconque. Elle s'instancie de deux manières, par identifiant ou par profil. Le profil permet d'utiliser une requête réalisée auparavant.Prérequis : Je recommande avant lecture d'avoir parcouru les tutoriaux POO et Singleton pour comprendre la PPO et l'utilisation d'élément statiques pour une classe.
Objectif : Dans un jeu où les différents éléments sont gérés par des classes, on souhaite pouvoir accéder aux éléments propres au joueur facilement, tout en évitant des requêtes inutiles et de devoir faire des classes différentes pour ce qui appartient au joueur et les autres.
Contexte : Un joueur se trouve dans une zone située dans une région. Ces éléments ne sont pas susceptibles de changer en dehors d'une action du joueur.
Présentation de la classe CharacterManager
Code PHP :
<?php
class CharacterManager
{
//inutilisés pour le moment
protected $output;
protected $log;
//variable principale où sont stokées les valeurs définissant un joueur.
protected $profile = array("status" => 0);
protected $id;
//constructeur, peut être appelé avec un identifiant ou un profil
public function __construct($profile, $complete = true)
{
//cas du profil, on recopie les array
if ($complete)
{
$this->profile = $profile;
$this->profile['status'] = 1;
}
else //cas de l'ientifiant, une requête est alors réalisée.
{
$query = 'SELECT * FROM player WHERE id_player="'.$profile.'"';
$result = connexion::GetSingleton()->query($query);
if($data = mysql_fetch_array($result))
$this->profile = array("status" => 1,
"id" => $data['id_player'],
"name" => $data['name'],
"life" => $data['life'],
"stamina" => $data['stamina'],
"money" => $data['wealth'],
"x" => $data['x'],
"y" => $data['y']);
}
}
...
Une des actions en particulier, note le commentaire sur la mise à jour de factory.
Code PHP :
<?php
public function GoToZone($id)
{
//Vérification, de la distance, on récupère les coordonnées d'arrivée de la zone.
$query = 'SELECT x,y from zone WHERE id_zone="'.$id.'"';
$result = connexion::GetSingleton()->query($query);
if ($data = mysql_fetch_array($result))
{
$x = $data["x"]; $y = $data["y"];
//test de distance, la somme des valeurs absolue doit être égale à 1 : ie on se déplace vers une case adjacente.
if ((abs($x - $this->profile["x"]) + abs($y - $this->profile["y"] )!= 1))
{
return false;
}
//mise à joueur du joueur en deux étapes : 1 mise à jour du profil BDD
$query = 'UPDATE player SET zone="'.$id.'", x="'.$x.'", y="'.$y.'" WHERE id_player="'.$this->profile["id"].'"';
//si la mise à jour fonctionne, on met à joueur le PlayerManager lui-même. Comme on l'a par pointeur, cela modifie aussi le profil dans Factory et en session.
if ($result = connexion::GetSingleton()->query($query))
{
$this->profile["zone"] = $id;
$this->profile["x"] = $x;
$this->profile["y"] = $y;
}
return $id;
}
return false;
}