Vous êtes ici Codes PHP et MySQL > Classes > Moteur de déplacement sur 1 map

 

Moteur de déplacement sur 1 map

Ci dessous n'est présenté que la classe omap, l'ensemble du script se télécharge ICI

Pour construire une map, il suffit de la créer dans le répertoire 'maps'.
Le principe de construction est simple : chaque case est représentée par le nom de
son image (tile).
Par exemple :
1 correspondra a 1.ext
'ext' peut-être défini dans l'objet omap, en appelanht la méthode setDisplay () et en
lui passanht comme paramètre votre extension. Par exemple : $map -> setDisplay (array ('ext' => 'jpg'));
Vos tiles auront alors l'extension .jpg.
Ainsi, dans notre exemple, 1 correspondra à 1.jpg.
L'ordre des éléments sera l'ordre défini dans le mod:
1234abcd
bf7g8hj6

affichera une map de 8 cases de l'ouest à l'est, et 2 cases du nord au sud.


La navigation fonctionne sur 8 directions, même si dans l'affichage de la navigation, je n'en ai prévu que 4.
Il faut pour l'instant modifier la méthode setNavigation de l'objet omap pour modifier l'affichage de la
navigation (et éventuellement ajouter les 4 directions manquantes).
Je me suis basé sur un pavé numérique pour représenter les directions. Donc 2 correspond au nord.
Pour ajouter le nord est par exemple, utilisez la valeur 9.

Pour les fichiers XML des évènements, conserver la même structure :
est l'élément racine
Un évènement est une chaine, donc l'élément commence par 'e' et est suivi des coordonnées x et y de l'évènements.
Exemple :

chaine

=> cet évènement se placera en x = 0 et y = 0.

REPERTOIRES :

class/ contient les fichiers de classes
maps/ contient les modules de map
nav/ contient les images pour la navigation
tiles/ contient les images pour les 'tiles'
char/ contient les images pour les personnages
events/ contient les fichiers XML des évènements

Télécharger l'ensemble du script



 
Johan Barbier
Site de l'auteur voir
[4] sources en PHP voir
Code vu 6748 fois
Enregistré le 14 Fév 2006
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute Moteur de déplacement sur 1 map
  • Partage ce code sur Facebook
 
 
 
 

Code Source


01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Moteur de déplacement sur 1 map                           */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts161-PHP.htm              */
/* Auteur         : Johan Barbier                                             */
/* Date édition   : 14 Fév 2006                                               */
/* Website auteur : http://www.phpsources.org                                 */
/*                                                                            */
/******************************************************************************/

/* ************************************************************************
* 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
    **************/

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

    /***************
    * constantes
    ***************/

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

    /***********************************************************************
    * 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 ($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 ($aOptions) {
        if (is_array ($aOptions)) {
            foreach ($aOptions as $clef => $valeur) {
                if (array_key_exists ($clef$this -> aDisplayOptions)) {
                    $this -> aDisplayOptions[$clef] = $valeur;
                }
            }
        } else {
            return false;
        }
    }

    /***********************************************************************
    * 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) {
        if (is_string ($sPath)) {
            $this -> aGlobalOptions['perso'] = $sPath;
            return true;
        } else {
            return false;
        }
    }

    /***********************************************************************
    * 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 ($aPos) {
        if (is_array ($aPos) && 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'].'" /></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'].'" />';
            }
            $sString .=  <<<EOS
</div>

EOS;
        }
        return $sString;
    }

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

    /***********************************************************************
    * 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) {
        $dir self::sNavDir;
        $this -> sNav = <<<EOS
<div style="margin-left: 10px;">
<img src="{$dir}/up.png" onclick="sendMove (8, '{$serialMap}');" class="dir">
</div>
<div>
<img src="{$dir}/left.png" onclick="sendMove (4,'{$serialMap}');" class="dir">
<img src="{$dir}/right.png" onclick="sendMove (6,'{$serialMap}');" class="dir">
</div>
<div style="margin-left: 10px;">
<img src="{$dir}/down.png" onclick="sendMove (2,'{$serialMap}');" class="dir">
</div>

EOS;
    }

}
?>


 

Fonctions du code

: Crée un tableau - (PHP 4, PHP 5)
: Vérifie si un fichier ou un dossier existe - (PHP 4, PHP 5)
: Lit le fichier et renvoie le résultat dans un tableau - (PHP 4, PHP 5)
: Convertit une chaîne de caractères en tableau - (PHP 5)
: - (PHP 4, PHP 5)
: Compte le nombre d'éléments d'un tableau ou le nombre de propriétés...
: Détermine si une variable est un tableau - (PHP 4, PHP 5)
: Vérifie si une clé existe dans un tableau - (PHP 4 >= 4.0.7, PHP 5)
: Détermine si une variable est de type chaîne de caractères - (PHP 4, PHP 5)
: Détermine si une variable est de type nombre entier - (PHP 4, PHP 5)
: Retourne les arguments d'une fonction sous la forme d'un tableau - (PHP 4,...
: Détermine si une variable est affectée - (PHP 4, PHP 5)
: Arrondit au nombre supérieur - (PHP 4, PHP 5)
: Arrondit à l'entier inférieur - (PHP 4, PHP 5)
: - (PHP 4, PHP 5)
: Encode une chaîne en MIME base64 - (PHP 4, PHP 5)
: Linéarise une variable - (PHP 4, PHP 5, PECL axis2:0.1.0-0.1.1)
: - (PHP 4, PHP 5)
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 
Librairie PHP

Connexion

 
 

Classes

 
 

PHP

 
 
 
 
    Offres d'emploi

Plus de 500 offres d'emploi PHP/MySQL

Offres d'emploi
 
    Editeur PHP
 
        Publicité