Location: PHPKode > scripts > RPG Ajax Creator > class/omap.cls.php
<?php
/** ********************************************************************************************************************************************
* CLASS OMAP
*
* @author	johan <hide@address.com>
* @version	2006-01-26
* @copyright : free to use, modify...do NOT sell. If you change this file, you'd be very nice to send me your changes :-)
***********************************************************************************************************************************************/

class omap {

	/**  ******************************************************************************************************
	* Propriétés
	********************************************************************************************************/

	/** ************
	* privées
	**************/
	private $aMap = array ();						// tableau de la map
	private $aDisplayMap = array ();					// tableau de la portion de map à afficher
	private $aDisplayOptions = array (					// tableau d'options d'affichage
		'maxDisplay' => 5,								// portion de la map à afficher. Ici, un carré de 5 * 5 cases
		'tiles' => 48,									// taille des cases (tiles) en pixels
		'bgColor' => '#000000',							// couleur de fond de la map - initialement, pour ujne option que j'ai enlevé depuis : le fog of war
		'ext' => 'png'									// extensions des images composant la map (tiles)
		);
	private $aGlobalOptions = array (					// tableau d'options globales
		'perso' => false								// utilisation du perso ou non. Pour mettre un perso, on remplacera false par l'url de son image
		);
	private $aPos = array (							// tableau de la position courante
		'x' => 0,										//coordonnée en x
		'y' => 0										// coordonnée en y
		);
	private $aMax = array ();						// tableau des bornes de la map
	private $sNav;									// chaine contenant l'affichage de la navigation

	/** *************
	* constantes
	***************/
	const sMapDir = 'maps/';							// répertoire des maps
	const sTilesDir = 'tiles/';							// répertoire des tiles
	const sNavDir = 'nav/';							// répertoire des boutons de navigation

	/** ******************************************************************************************************
	* Constructeur
	* @Params mixed mMap : nom du fichier mod ou tableau mod
	********************************************************************************************************/
	public function __construct ($mMap) {
		if (file_exists (self::sMapDir.$mMap)) {
			$aChaine = file (self::sMapDir.$mMap);
			foreach ($aChaine as $val) {
				$this -> aMap[] = str_split (trim ($val));
			}
		} else {
			return false;
		}
		$this -> aMax = array ('x' => count ($this -> aMap) - 1, 'y' => count ($this -> aMap[0]) - 1);
	}

	/** ******************************************************************************************************
	* Méthode init
	* @Params array aProps : tableau des propriétés à initialiser
	********************************************************************************************************/
	private function init (array $aProps) {
		foreach ($aProps as $propName => $propValue) {
			$this -> $propName = $propValue;
		}
	}

	/** ******************************************************************************************************
	* Méthode setDisplay
	* permet de mettre à jour une option du tableau d'affichage
	* @Params array aOptions : tableau d'options, avec comme clef, un nom d'option valide
	* et comme valeur associée, la valeur voulue
	* @Return bool true/false
	********************************************************************************************************/
	public function setDisplay (array $aOptions) {
		foreach ($aOptions as $clef => $valeur) {
			if (array_key_exists ($clef, $this -> aDisplayOptions)) {
				$this -> aDisplayOptions[$clef] = $valeur;
			}
		}
	}

	/** ******************************************************************************************************
	* Méthode setPerso
	* initialise l'url vers l'image du perso
	* @Params string sPath : chaîne représentant l'url de l'image
	* @Return bool false en cas d'échec, true en cas de succès
	********************************************************************************************************/
	public function setPerso ($sPath) {
		$this -> aGlobalOptions['perso'] = $sPath;
	}

	/** ******************************************************************************************************
	* Méthode setPos
	* initialise la position de départ
	* @Params array aPos : tableau des coordonnées x et y de la position de départ
	* @Return bool false en cas d'échec
	********************************************************************************************************/
	public function setPos (array $aPos) {
		if (count ($aPos) === 2) {
			foreach ($aPos as $clef => $val) {
				if (is_int ($val) && array_key_exists ($clef, $this -> aPos)) {
					$this -> aPos[$clef] = $val;
				}
			}
		} else {
			return false;
		}
	}

	/** *****************************************************************************************************
	* Méthode get
	* permet de récupérer la valeur d'une ou plusieurs propriété(s) de la classe
	* On peut passer n'importe quel nombre de paramètres, sous la forme de chaînes ayant
	* pour valeur le nom d'une  propriété EXISTANTE de la classe
	*******************************************************************************************************/
	public function get () {
		$aArgs = func_get_args();
		foreach ($aArgs as $clef => $arg) {
			if (isset ($this -> $arg)) {
				$aRetour[$arg] = $this -> $arg;
			}
		}
		if (isset ($aRetour) && is_array ($aRetour)) {
			return $aRetour;
		} else {
			return false;
		}
	}

	/** ******************************************************************************************************
	* Méthode getCharPos
	* permet de récupérer la position courante du personnage
	* @Return array
	********************************************************************************************************/
	public function getCharPos () {
		return $this -> aPos;
	}

	/** ******************************************************************************************************
	* Méthode magique __toString
	* permet d'afficher la map si désiré
	* @Return string
	********************************************************************************************************/
	public function __toString () {
		$sString = $this -> sNav;
		$width = $this -> aDisplayOptions['tiles'] * $this -> aDisplayOptions['maxDisplay'];
		if (false !== $this -> aGlobalOptions['perso']) {
			$sString .= '<div style="position: relative; top: '.$this -> aDisplayOptions['tiles'] * ceil($this -> aDisplayOptions['maxDisplay']/2).'px; left: '.$this -> aDisplayOptions['tiles'] * floor($this -> aDisplayOptions['maxDisplay']/2).'px;z-index: 1000"><img src="'.$this -> aGlobalOptions['perso'].'" alt="Avatar"/></div>';
		}
		foreach ($this -> aDisplayMap as $clef => $dump) {
			$sString .= <<<EOS
<div style="background-color: {$this -> aDisplayOptions['bgColor']}; width: {$width}px;">

EOS;
			foreach ($this -> aDisplayMap[$clef] as $clef2 => $img) {
				$sString .= '<img src="'.self::sTilesDir.$img.'.'.$this -> aDisplayOptions['ext'].'" alt="'.$img.'"/>';
			}
			$sString .=  <<<EOS
</div>

EOS;
		}
		return $sString;
	}

	/** ******************************************************************************************************
	* Méthode getMove
	* intercepte le post envoyé par l'objet xmlhttp
	********************************************************************************************************/
	public function getMove ($map, $fight = false) {
		if (isset ($_POST['dir']) && is_numeric ($_POST['dir'])) {
			$this -> setMove ($_POST['dir']);
		}
		$serialMap = base64_encode (serialize ($this -> aPos));
		$this -> setNavigation ($serialMap, $fight);
	}

	/** ******************************************************************************************************
	* Méthode setMove
	* permet de modifier la position courante sur la map
	* modifie la propriété $this -> aPos
	* calcul sur 8 directions
	********************************************************************************************************/
	private function setMove ($dir) {
		$dir = intval ($dir);
		/**********
		* ouest
		**********/
		if ($dir === 4) {
			$this -> aPos['y'] -= 1;
			if ($this -> aPos['y'] < 0) {
				$this -> aPos['y'] = 0;
			}
		}
		/**********
		* est
		**********/
		elseif ($dir === 6) {
			$this -> aPos['y'] += 1;
			if ($this -> aPos['y'] > $this -> aMax['y']) {
				$this -> aPos['y'] = $this -> aMax['y'];
			}
		}
		/**********
		* nord
		**********/
		elseif ($dir === 8) {
			$this -> aPos['x'] -= 1;
			if ($this -> aPos['x'] < 0) {
				$this -> aPos['x'] = 0;
			}
		}
		/**********
		* nord ouest
		**********/
		elseif ($dir === 7) {
			$this -> aPos['x'] -= 1;
			$this -> aPos['y'] -= 1;
			if ($this -> aPos['x'] < 0) {
				$this -> aPos['x'] = 0;
			}
			if ($this -> aPos['y'] < 0) {
				$this -> aPos['y'] = 0;
			}
		}
		/**********
		* nord est
		**********/
		elseif ($dir === 9) {
			$this -> aPos['x'] -= 1;
			$this -> aPos['y'] += 1;
			if ($this -> aPos['x'] < 0) {
				$this -> aPos['x'] = 0;
			}
			if ($this -> aPos['y'] > $this -> aMax['y']) {
				$this -> aPos['y'] = $this -> aMax['y'];
			}
		}
		/**********
		* sud
		**********/
		elseif ($dir === 2) {
			$this -> aPos['x'] += 1;
			if ($this -> aPos['x'] > $this -> aMax['x']) {
				$this -> aPos['x'] = $this -> aMax['x'];
			}
		}
		/**********
		* sud ouest
		**********/
		elseif ($dir === 1) {
			$this -> aPos['x'] += 1;
			$this -> aPos['y'] -= 1;
			if ($this -> aPos['x'] > $this -> aMax['x']) {
				$this -> aPos['x'] = $this -> aMax['x'];
			}
			if ($this -> aPos['y'] < 0) {
				$this -> aPos['y'] = 0;
			}
		}
		/**********
		* sud est
		**********/
		elseif ($dir === 3) {
			$this -> aPos['x'] += 1;
			$this -> aPos['y'] += 1;
			if ($this -> aPos['x'] > $this -> aMax['x']) {
				$this -> aPos['x'] = $this -> aMax['x'];
			}
			if ($this -> aPos['y'] > $this -> aMax['y']) {
				$this -> aPos['y'] = $this -> aMax['y'];
			}
		}
		else {
			return false;
		}
	}

	/** ******************************************************************************************************
	* Méthode getDisplay
	* permet d'obtenir la portion de map à afficher
	* modifie la propriété $this -> aDisplay
	********************************************************************************************************/
	public function getDisplay () {
		$minus = floor ($this -> aDisplayOptions['maxDisplay'] / 2);
		for ($i = - $minus; $i <= $minus; $i ++) {
			$aX[] = $this -> aPos['x'] + $i;
			$aY[] = $this -> aPos['y'] + $i;
		}
		foreach ($aX as $clefX => $valX) {
			foreach ($aY as $clefY => $valY) {
				if (isset ($this -> aMap[$valX][$valY])) {
					$this -> aDisplayMap[$clefX][$clefY] = $this -> aMap[$valX][$valY];
				} else {
					$this -> aDisplayMap[$clefX][$clefY] = 'blank';
				}
			}
		}
	}

	/** ******************************************************************************************************
	* Méthode setNavigation
	* met en place la navigation
	* seules 4 directions sont affichées.
	* vous devez modifier cette fonction pour afficher les 8 directions possibles
	* les valeurs à mettre dans l'appel de la fonction js sendMove sont définies par la
	* direction représentée sur un pavé numérique.
	* nord est par exemple aura la valeur 9.
	* De même, pour modifier les graphismes de la navigation, vous devez les modifier
	* directement ici, pour le moment.
	* @Param string serialMap : instance omap linéarisée
	* @Param bool fight : est on dans une situation de combat ou non
	* @Return string sString : affichage html de la navigation
	********************************************************************************************************/
	private function setNavigation ($serialMap, $fight = false) {
		$display=($fight === true)?'style="visibility:hidden;"':'';
		$dir = self::sNavDir;
		$this -> sNav = <<<EOS

<div id="nav" {$display}><div style="margin-left: 10px;"><img src="{$dir}/up.png" onclick="sendMove (8, '{$serialMap}');" class="dir" alt="nord"/></div>
<div><img src="{$dir}/left.png" onclick="sendMove (4, '{$serialMap}');" class="dir" alt="ouest"/><img src="{$dir}/right.png" onclick="sendMove (6, '{$serialMap}');" class="dir" alt="est"/></div>
<div style="margin-left: 10px;"><img src="{$dir}/down.png" onclick="sendMove (2, '{$serialMap}');" class="dir" alt="sud"/></div></div>

EOS;
	}

}
?>
Return current item: RPG Ajax Creator