[php5]rpg creator version [alpha]

Description

Voici un moteur simple de déplacement sur une map.
Simple, parce que je n'aiu pas tout implémenté encore...je ferai peut-être des mises à jour, sans doute même...à moins que je ne décide de créer mon jeu un de ces 4 ;-)

Le principe est relativement simple. Ajax est utilisé pour les déplacements.
Un objet omap gère la map elle-même. On peut jouer sur différents paramètres : avec ou sans personnage,
modification de l'affichage etc...
La version que je possède est un peu plus complète, mais je la mettrai plus tard ici. Je compte
notamment permettre une gestion simple des objets, divers retours, et un affichage de map en 3d isométrique.

J'ai codé en utilisant exprès diverses fonctionnalités afin de les montrer. En vrac :
- syntaxe heredoc
- utilisation des méthodes magiques __toString, __sleep, __wakeup
- utilisation d'ajax sur 1 seule page
...

Source / Exemple :


<?php
/* *********************************************************************************************************************************************

  • CLASS OMAP
*
  • @author johan <barbier_johan@hotmail.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.
  • @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; } } ?>

Conclusion :


Je n'ai mis comme source texte que l'objet omap.
Le reste du code est dans le zip :-)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.