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

Algorithmes et structures de données Discussion :

Rendu isometric, ordre d'affichage


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Rendu isometric, ordre d'affichage
    Bonjour à tous,

    Dans le but de créer un petit jeu par la suite, je me suis lancé dans la création d'un moteur de rendu isométrique (basé sur opengl).

    Mes maps sont stockées dans des tableaux à 2 dimensions, chaque case corresponde à un "tile" (carré de la map un fois dessinée).
    A l'heure actuelle j'arrive à les dessiner de cette façon là :


    Le problème est que l'ordre d'affichage n'est pas respecté, il devrait être :


    En observant les coordonnées des cases dans l'ordre on a pour (x;y) :
    A : (0;0)
    B : (1;0)
    C : (0;1)
    D : (2;0)
    E : (1;1)
    F : (0;2)
    G : (3;0)
    H : (2;1)
    I : (1;2)
    J : (0;3)

    On remarque que :
    X : 0 - 1,0 - 2,1,0 - 3,2,1,0
    Y : 0 - 0,1 - 0,1,2 - 0,1,2,3
    Et ainsi de suite, jusqu'à la moitié de la map.

    Donc en résumé je n'arrive pas pondre l'algo permettant de faire cela, les boucles quoi !

    Ca serait fantastique si quelqu'un aurait un lien à me passer où mon problème est expliqué ! Ou un grand fou capable de m'expliquer lui même

    EDIT :
    J'ai oublié de préciser que j'utilise pour l'instant une solution qui fonctionne, mais qui n'est pas performante :

    1, je charge la map
    2, je récupère (x+y*largeur map) pour chaque case dans une liste (indice de profondeur)
    3, je récupère une liste de Point(X,Y)(X,Y sont les coordnonnées calculé oû devront être dessiné les cases) de façon à ce que une case à l'indice "i" de la première liste corresponde à la 2ème.
    4, je tri la première liste (tri bulle simple) à chaque inversement de valeur, j'inverse la même chose dans la 2ème liste, dans le but que ma 2ème liste soit trié selon les valeurs de la 1ère !

    A priori, cette technique à l'air plutôt performante (un seul appel au chargement de la map) mais dés qu'une case de la map bouge, il faut tout re-trier ! Exemple, j'ai une case "joueur", quand je le déplace, je doit effectuerles mêmes opérations (qui sont assez coûteuse) qu'au chargement de la map.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2012
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Finalement j'ai réussis à mettre en place l'aglo que je cherchais, en perdant le temps que je n'aurais pas voulu perdre (comment remplir son temps libre pendant 3 jour ? Ok^^ je n'ai pas fais que ça ..), étant donné que je déteste tomber sur des fofo sans réponses lorsque je cherche quelque chose, voici ma solution, qui ne fonctionne qu'avec des matrices carré :

    Double boucle imbriquée, car une va jusqu'à la moitié(+1) de la matrice (en diagonale bien-sur) et l'autre fait le reste.
    N = taille de la matrice
    Z = Indice de hauteur (ma map étant divisée en couches, je le laisse affiché à titre informatif, car il ne fait pas vraiment partie de l'algorithme.
    Point3 = Simple class qui stock 3 integer (x,y,z) (ne faisant pas partie de l'API c#).
    De cette façon, mes "tiles" sont parfaitement ordonnées.
    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
     
    for (int X = 0; X < n; X++)
    {
       for (int Y = 0; Y < X + 1; Y++)
       {
          Point3 P = new Point3(Y, X - Y, Z);
          tiles.Add(p);
       }
    }
    for (int X = 1; X <= n; X++)
    {
       for (int Y = 0; Y < n - X; Y++)
       {
          Point3 P = new Point3(n - Y - 1, X + Y, Z);
          tiles.Add(p);
       }
     }

    PS : Je m'intéresse beaucoup au développement de jeux, où autre projet faisant appelle aux librairies graphique ainsi qu'aux maths, donc si quelqu'un recherche un partenaire pour un projet, ou a des questions, ou n'importe quoi d'autre, je suis dispo !

Discussions similaires

  1. [SQL] Ordre d'affichage des lignes d'un état
    Par duboisfa dans le forum Oracle
    Réponses: 20
    Dernier message: 28/02/2006, 23h00
  2. [Oracle] Ordre d'affichage de lignes d'une requête
    Par duboisfa dans le forum Langage SQL
    Réponses: 14
    Dernier message: 27/02/2006, 19h05
  3. [Reports 6] Ordre d'affichage des lignes d'un état
    Par duboisfa dans le forum Reports
    Réponses: 2
    Dernier message: 17/02/2006, 16h21
  4. [Débutant] Ordre d'affichage, 2D
    Par YéTeeh dans le forum OpenGL
    Réponses: 4
    Dernier message: 13/06/2005, 19h51
  5. Réponses: 5
    Dernier message: 08/03/2005, 13h22

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