Bonjour tout le monde,

J'ai un souci! J'essaye tant bien que mal de créer un petit jeu tout simple, qui consiste à:

-déplacer un personnage sur une carte divisée en un certain nombre de zones polygonales (un joueur clique sur une zone pour changer la position de son personnage).

-générer un événement quand un personnage arrive dans une zone.
Jusqu'à présent j'ai réussit à permettre le déplacement, mais dans n'importe quelle zone. Un joueur clique sur une zone puis je récupère son choix via un formulaire.
Le problème étant que je ne veux pas qu'il puisse se rendre dans une zone qui ne jouxte pas la sienne.

Pour l'instant j'ai réussi à éviter que le joueur clique dans une zone qui n'est pas référencée ("") . Par mon code pour tester si une zone bien bien la zone voisine de son emplacement actuel, ça coince.

Dans ma base de données j'ai 2 tables utilisées pour ce sujet là. Zones et Players. La première référence toutes les zones avec un numéro (num), un nom (name), et la liste de ses zones voisines (borders = par exemple pour la zone Z1, dans la colonne borders j'ai "Z2, Z3". ). La seconde référence l'ensemble des joueurs, avec un numéro (num), un login, un password, leur position (position), et quelques autres trucs.
J'ai créé une fonction appelée border() qui prend en argument le nom de la zone qui a été cliquée, et qui regarde si elle figure dans les voisins de la position actuelle du personnage avec in_array.
Mais ça ne veut pas fonctionner!

function display_map() {
        $cdb = new class_mysql; 
        $r = "<script LANGUAGE='JavaScript' type='text/javascript'>
        function update(id_map) {
            document.formmap.pos.value = id_map;
        }
        </script>

        <div class='map'>
        <img src='maps/maptest.jpg' usemap='#maptest' border=0 align='center'>
        <map name='maptest'>
            <area href='#' name='Zone_4' value='Z4' shape='poly' coords='51,17,122,49,119,100,59,132,31,131,20,114,9,103,17,77,48,64,52,16,58,34' onClick=\"update('Z4')\" style='cursor:hand;' OnMouseOver='window.status='Z4'; return true'>
            <area href='#' name='Zone_2' value='Z2' shape='poly' coords='167,27,121,48,120,99,177,135,199,122,201,82,213,73,213,54,184,46,168,28,168,83' onClick=\"update('Z2')\" style='cursor:hand;' OnMouseOver='window.status='Z2'; return true'>
            <area href='#' name='Zone_3' value='Z3' shape='poly' coords='119,105,177,135,177,220,101,219,71,188,62,158,68,147,60,134,118,104,124,143' onClick=\"update('Z3')\" style='cursor:hand;' OnMouseOver='window.status='Z3'; return true'>
            <area href='#' name='Zone_1' value='Z1' shape='poly' coords='178,134,178,219,250,221,300,182,286,168,268,169,223,158,198,121,189,133' onClick=\"update('Z1')\" style='cursor:hand;' OnMouseOver='window.status='Z1'; return true'>
          <area shape='default' onClick=\"update('Ceci n'est pas une zone')\" onMouseOver=\"window.status='position'; return true\">
        </map>

        <form name='formmap' method='POST' action='$PHP_SELF?action=move'>
            <button type='submit' name='pos' class='std-button'>Selectionnez une zone puis cliquez-ici!</button>
        </form>
        </div>";

        return $r;
    }

function move($pos){
            $cdb    = new class_mysql; 

            if ($pos!="")
            {
                if(border($pos)){
                $cdb->update("UPDATE players SET position='$pos' WHERE num='".$_SESSION['PLAYER_USERNUM']."'");
                }
            }
    }

function border($pos) {
            $cdb = new class_mysql;

            $cdb->select("SELECT position FROM players WHERE num='".$_SESSION['PLAYER_USERNUM']."'");
            $row    = $cdb->fetchArray();
            $cdb->select("SELECT borders FROM zones WHERE name='$row['position']' ");
            $row    = $cdb->fetchArray();

            if (in_array($pos, explode(",",$row['borders']))) { return true; } else { return false; }
    }

    function display_game() {  
        global $CONFIG;
        if(isset($_GET['action']) && ($_GET['action'] == "move")) { $this->move($_POST['pos']); }   

Voici une map exemple que j'utilise avec 4 zones:

1 réponse


Est-ce que tu pourrais mettre dans ta fonction border avant les return :

var_dump($pos);
var_dump(explode(",",$row['borders']));

Pour voir ce que tu as dedans.