IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Création d'une carte, solution la plus efficace ?


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Création d'une carte, solution la plus efficace ?
    Bonjour.

    Je suis en train de réaliser une sorte de carte pour un jeux.

    Voila comment fonctionne mon code :

    Il y à un tableau HTML qui fais 23 colonnes et 17 lignes.
    Vous pouvez voir ce tableau ici :
    http://burgerkill.fr/temp/edit-map-small.htm

    Le centre de cette carte correspond à la position d'un personnage. Par exemple, si ce personnage à dans la base de donnée x5,y5 alors l'image charger au milieux du tableau sera celle qui, dans la base de donnée, à pour x=5 et y=5.
    C'est pourquoi on peut voir la variable $p0p0 au centre, qui signifie x plus 0 et y plus 0.

    On comprends donc que la case juste au dessus, $p0m1 signifie x plus 0 et y moins 1. Si vous m'avez compris jusque là, passons au chose sérieuse.

    Vous comprenez que mon script va devoir charger 23x17 images en fonction de la position initial du personnage. Sois 391 images :s

    J'ai pensé à deux méthode et je voudrais savoir laquelle serais la plus légère et surtout si il n'y en à pas une plus efficace ?

    /!\ Les codes sont la à titre d'exemples pour illustrer le fonctionnement, je sais qu'ils ne sont pas exacte. /!\

    Voici donc la première :

    - Un listing de toute la table " map " avec au total 391 if, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (($x=$x-1) and ($y=$y-1)) { $m1m1=$img; }
    if (($x=$x-1) and ($y=$y-2)) { $m1m2=$img; }
    if (($x=$x-1) and ($y=$y-3)) { $m1m3=$img; }
    etc ...
    Le problème avec cette méthode c'est qu'il va faire listing de toute la table, même des entré correspondante à une position x,y qui n'est pas dans le tableau.

    La deuxième méthode :

    - Un listing colonne par colonne, ce qui veut dire que je ferais plusieurs listing. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $listing = mysql_query("SELECT img FROM map WHERE x=$x-1");
    $listing = mysql_query("SELECT img FROM map WHERE x=$x-2");
    $listing = mysql_query("SELECT img FROM map WHERE x=$x-3");
    et pour chaque listing de la table, je ferais une série de IF vérifiant la valeur de y, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($y=$y-1) { $m1m1=$img; }
    if ($y=$y-2) { $m1m2=$img; }
    if ($y=$y-3) { $m1m3=$img; }
    Donc pour résumé, dans la première méthode j'ai un listing total de la table (donc si la table map contient 1500 entrée, il va toute les vérifier juste pour en sortir 391 !

    Avec la deuxième méthode il va faire 23 requettes différente au lieux d'une seul, car il y à 23 colonne, en contre partie il ne va fouiller que les entrée dont le champ x correspond à ceux du tableau html.

    Laquelle de ces méthode serais la plus légère et surtout, quelqu'un aurais une idée moins rébarbatif ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Moi je m'orienterais ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <?php
    $posx = 33;
    $posy = 4;
     
    //lire toute la table sur la plage 
    $sql = "SELECT * FROM carte WHERE (x >= $posx-11 OR x <= $posx+11) AND (y >= $posy-8 OR y <= $posy+8)";
    $result = mysql_query($sql);
     
    // classer le resultat dans un tableau $map[x][y] = donnee
    while ($row = mysql_fetch_array($result)) {
        $map[$row['x']][$row['y']]['image'] = $row['image'];
    }
     
    // construire la carte
    echo '<table>';
    for ($y = $posy-8; $y <= $posy+8; $y++) {
         echo '<tr>';
         for ($x = $posx-11; $x <= $posx+11; $x++) {
              if ($x < 1 || $y < 1) { $img = 'horszone.jpg'; }
              elseif (isset($map[$x][$y])) { $img = $map[$x][$y]['image']; }
              else { $img = 'default.jpg'; }
              echo '<td>' . $y . '<img src="' . $img . '"></td>';
         }
        echo '</tr>';
    }
    echo '</table>';
    ?>

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Je te remercie beaucoup pour ta réponse, grâce à ton SELECT j'ai trouvé une solution similaire que je comprend aisément.

    D'ailleurs pourrais tu m'expliquer dans la boucle de ton for pourquoi il y à des ; ?

    Pour la solution que je vais utiliser c'est effectivement de reprendre ton SELECT, je n'y avais pas pensé à ça !! Ensuite je vais construire simplement les variable de la sorte grâce à un while :

    $differencex = $x - $posx;
    $differencey = $y - $posy;
    if ($differencex>=0) { $var = "p".$differencex; } else { $var = "m".$differencex }
    if ($differencey>0) { $var. = "p".$differencey; } else { $var = "m".$differencey }
    Ce qui donnerais le nom de la case comme je le présente dans mon tableau html. Par exemple si le joueur est sur la position x4,y1 la case x4,y2 donnera pour $var = p0p1 !!

    A partir de là il me manque juste un petit truc, comment faire pour que le contenue de $var devienne une variable, autrement dis pour transformer p0p1 en la variable $p0p1

    Voila, la méthode est différente mais je la comprends mieux xD Je pense qu'elle reste tout autant potable ?

    Merci beaucoup en tout cas.

Discussions similaires

  1. Création d'une carte géographqiue pour un jeu.
    Par Space Cowboy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/03/2007, 12h26
  2. création d'une carte au format jpg
    Par TocTocKiéLà? dans le forum C++
    Réponses: 2
    Dernier message: 13/02/2007, 17h28
  3. une solution loop plus efficace?
    Par monopole dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/09/2006, 14h40
  4. [MySQL] Incrémenter une sous-chaine le plus efficacement possible ?
    Par smrhp dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/06/2006, 15h58
  5. création d'une carte avec navigation du type mappy
    Par BernardT dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 30/10/2005, 01h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo