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

Développement 2D, 3D et Jeux Discussion :

liste ou tableau ?


Sujet :

Développement 2D, 3D et Jeux

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut liste ou tableau ?
    Bonjour,

    voilà j'ai une simple petite question en c++ : dans un jeu (peu importe le type, la forme. quel est le moyen(liste, tableau, autre...) le plus rapide/efficace pour stocker :
    1. tiles
    2. objet fixe
    3. objets mobiles
    4. ...


    dejà doit on les mettre dans une même structure ? (même liste, même tableau ?) ou separer les decor des joueurs, des ennemis..?


    quand je parle de tableau je parle de tableau à 2 dimension où les [i][j] contient l'objet contenu à la position (i,j) ... avec par exemple 0 = rien, 1 = un certain type de decor.....

    Ensuite si tableau à 2 dim, le plus rapide est-il d'utiliser un tableau à 1 dim (oui ca fait bizarre d'ecrire ca) d'une dimension hauteur*largeur. ?


    bien entendu je pense qu'il n'y a pas "une facon de faire" mais quelle est celle que vous utilisez ?

    (je pense qu'avec des tableaux de 10x10 il ne doit pas y avoir de différence, mais pour les grand tableaux : 1000x1000.. (plus?) ?)

    merci

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pour faire court, il n'y a pas de bonne solution. Généralement, j'utilise un tableau lorsque je définis un nombre maximum d'éléments et une liste quand je ne connais pas ce nombre.

    Sachant que le choix dépend aussi de ce qu'on en fait :

    Triage -> Tableau
    Ajout/Suppression -> Liste
    Connaître le nombre -> Tableau

    Mais même là, cela dépend...

    quand je parle de tableau je parle de tableau à 2 dimension où les [i][j] contient l'objet contenu à la position (i,j) ... avec par exemple 0 = rien, 1 = un certain type de decor.....
    Classique

    Ensuite si tableau à 2 dim, le plus rapide est-il d'utiliser un tableau à 1 dim (oui ca fait bizarre d'ecrire ca) d'une dimension hauteur*largeur. ?
    Si ton tableau est définit statiquement, alors c'est le calcul que fait le compilateur donc pas la peine de le faire toi...

    Si c'est un tableau 2 dimensions dynamique, alors en 1 dimension tu seras en principe plus rapide mais c'est de loin pas la plus importante des choses. En prenant une minute pour un détail tu perds une minute pour le reste qui est plus important (on est presque à la limite de la facon d'indenter le code, j'exaggère bien sûr).

    bien entendu je pense qu'il n'y a pas "une facon de faire" mais quelle est celle que vous utilisez ?
    Les deux.

    Jc

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    par contre petite remarque concernant le tableau à 2 dim pour les decors.. si par exemple j'ai pour un jeu omme mario un decor que "en bas" du point de vu de mon tableau j'aurai quand meme hauteur*largeur cases.... mais je n'utilise que les "cases" du bas.. n'est ce pas perdre de la place ? ou faut il mieux de tout stocker dans un liste ?

    Cependant le fait que ce soit [i][j] permet un acces plus rapide, par exemple je veux le decor juste en dessous du perso... si j'ai une liste, je suis obligé de la parcourir ( or methode de decoupage en zone...) alors que avec un tableau je pends directement : tab[x'][y']...qu'en pensez vous ??

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par CaptainChoc
    par contre petite remarque concernant le tableau à 2 dim pour les decors.. si par exemple j'ai pour un jeu omme mario un decor que "en bas" du point de vu de mon tableau j'aurai quand meme hauteur*largeur cases.... mais je n'utilise que les "cases" du bas.. n'est ce pas perdre de la place ? ou faut il mieux de tout stocker dans un liste ?
    Effectivement mais généralement, il y a aussi des petits décors qui peuvent se mettre dans les cases et ...

    Cependant le fait que ce soit [i][j] permet un acces plus rapide, par exemple je veux le decor juste en dessous du perso... si j'ai une liste, je suis obligé de la parcourir ( or methode de decoupage en zone...) alors que avec un tableau je pends directement : tab[x'][y']...qu'en pensez vous ??
    cette remarque est primordiale et c'est pour cela que j'utiliserai toujours un tableau pour un genre mario...

    Jc

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    donc si je comprends bien : pour ce qui est des decors (tiles) il faut plutot utiliser un tableau(2 ou 1 dim c'est pas important ). Ensuite pour ce qui est des ennemis et autres objets se deplacant plutot une liste (car on ne sais pas cb il y en a)

    c'est bien ca ?


    par contre imaginons que je veuille faire une plateforme qui bouge.... donc si je la stocke dans le tableau : elle fera 3tiles de long(3cases dans mon tableau) et a chq fois je deplace ces 3 tiles. Ou alors, dois je stocker cette plateforme dans la liste des autres objets.. masi du coup le teste de collision (car ca reste du "sol") je devrai quand meme parcourir la liste.....

    Je sais pas si je m'embrouille tout seul lol masi je me pose la question.....

    merci

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    J'ai fait un jeu à une époque lointaine qui ressemblait de très loin à un Mario (c'est un remake du jeu Joust pour les anciens)...

    Pour les ennemis, persos, objets, sols qui bougent -> Liste
    Pour les choses statiques -> tableau

    Sachant que j'ai passé rapidement à tout en liste pour que ce soit plus pratique mais j'avais 15 objets au maximum donc le problème n'est pas très important...

    Par exemple, si ton sol de mario peut-être considéré comme un grand bloc, c'est donc un seul objet, utilise une liste, c'est plus pratique (j'utilisais une texture à répétition donc le problème n'était pas très grave). Mais si tu veux une tuile par case alors il faudra utiliser un tableau ou que l'objet sache se dessiner tout seul (ce qui est aussi une solution. Un objet peut avoir des info internes mais pour la collision une seule place dans la liste des objets...

    Généralement, je fais un gestionnaire d'objets. Les objets s'inscrivent et le gestionnaire appels les fonctions de collisions et c'est aux objets de dire s'il y a une collision, qu'est-ce qui doit être fait, etc.

    Jc

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    donc donc oui j'utilise des tuiles... ensuite dans ma classe jeu je vois bien un truc genre :
    1. une liste contenant le persos, les ennemis...(tout ce qui n'est pas decor)
    2. un objet de type decor, dnas un objet il y aurai :

      1. mon tableau de tile (test de collision mais pas de mise a jour)
      2. une liste des decors mobiles (se met a jour + test collision)
      3. une liste des decor pour faire beau....(maison..) (rien)



    ainsi pour tester les collisions avec le sol, pour retrouver le sol en dessous : je ne teste que avec le tableau ou la liste des decors mobiles (le tout se trouvant dans la classe Decor)

    cela te semble t'il cohérant ?

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par CaptainChoc
    donc donc oui j'utilise des tuiles... ensuite dans ma classe jeu je vois bien un truc genre :
    1. une liste contenant le persos, les ennemis...(tout ce qui n'est pas decor)
    2. un objet de type decor, dnas un objet il y aurai :
    Pour un jeu comme mario j'aurais une image que je fais scroller dans le fond et après des décors surlequel je peux sauter, bouger qui effectivement se divise en deux parties mobiles ou non.

    1. mon tableau de tile (test de collision mais pas de mise a jour)
    2. une liste des decors mobiles (se met a jour + test collision)
    3. une liste des decor pour faire beau....(maison..) (rien)


    ainsi pour tester les collisions avec le sol, pour retrouver le sol en dessous : je ne teste que avec le tableau ou la liste des decors mobiles (le tout se trouvant dans la classe Decor)
    C'est une bonne solution... Cela dépend ce que tu veux faire... Une autre solution plus simple serait de dire :

    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
     
    On a un tableau qui représente les cases de l'écran.
     
    Pour chaque objet de l'écran,
     
    Mettre à jour sa position dans le jeu. 
     
    Regarder la case du tableau corespondante à sa position.
     
    Si la case du tableau correspondant à sa position est occupée alors
      Test de collision avec l'objet en question
      Gestion de la collision
    Sinon
      On met dans la case correspondante à jour
    Fin si
    Cela simplifie le problème. Il suffit de parcourir à chaque rendu les objets, mettre à jour le tableau pour facilement vérifier s'il y a une collision.

    Ceci ne change pas vraiment ta facon de faire:

    On commence par parcourir le décor pour mettre à jour le tableau et dessiner
    Ensuite les persos, ennemis, etc.

    Ceci n'est pas testé, mais cela sera probablement plus rapide que les parcours de listes chaînées...

    Jc

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par CaptainChoc
    donc donc oui j'utilise des tuiles... ensuite dans ma classe jeu je vois bien un truc genre :
    1. une liste contenant le persos, les ennemis...(tout ce qui n'est pas decor)
    2. un objet de type decor, dnas un objet il y aurai :
    Pour un jeu comme mario j'aurais une image que je fais scroller dans le fond et après des décors surlequel je peux sauter, bouger qui effectivement se divise en deux parties mobiles ou non.

    ainsi pour tester les collisions avec le sol, pour retrouver le sol en dessous : je ne teste que avec le tableau ou la liste des decors mobiles (le tout se trouvant dans la classe Decor)
    C'est une bonne solution... Cela dépend ce que tu veux faire... Une autre solution plus simple serait de dire qu'on divise juste décor et perso/ennemi/objet:

    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
     
    On a un tableau qui représente les cases de l'écran.
     
    Pour chaque objet de l'écran,
     
    Mettre à jour sa position dans le jeu. 
     
    Regarder la case du tableau corespondante à sa position.
     
    Si la case du tableau correspondant à sa position est occupée alors
      Test de collision avec l'objet en question
      Gestion de la collision
    Sinon
      On met dans la case correspondante à jour
    Fin si
    Cela simplifie le problème. Il suffit de parcourir à chaque rendu les objets, mettre à jour le tableau pour facilement vérifier s'il y a une collision.

    Ceci ne change pas vraiment ta facon de faire:

    On commence par parcourir le décor pour mettre à jour le tableau et dessiner
    Ensuite les persos, ennemis, etc.

    Ceci n'est pas testé, mais cela sera probablement plus rapide que les parcours de listes chaînées...

    Jc

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    oui alors petit note :

    tu diviserais "l'ecran" en cadrillage dont chq case est la hauteur/largeur des tuiles en fait?

    donc en fait mon perso serai dans plusieurs cases en même temps(car plus grand que les decors... ?

    ca simplifie le teste de collision avec les decors, mais avec les autres entités il faut quand même que je parcours ma liste "joueur/ennemis/objet" c'est bien ca ?

    et donc ma plateforme serai dans joueur/ennemis/objet...?

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Points : 81
    Points
    81
    Par défaut
    je viens de penser, je pense que ca ne marchera pas.. car en fait les collison j'utilise le pixel perfect (pour pouvoir faire des surface incliné et faire glisser mon perso) hors il il se peut que la boite englobante le perso ne soit paspile au bord du perso.... donc une parti de la boite peut etre dasn une case ou il y a un decor sans qu'il y ait une collision... je sais pas si je suis clair ?

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par CaptainChoc
    je viens de penser, je pense que ca ne marchera pas.. car en fait les collison j'utilise le pixel perfect (pour pouvoir faire des surface incliné et faire glisser mon perso) hors il il se peut que la boite englobante le perso ne soit paspile au bord du perso.... donc une parti de la boite peut etre dasn une case ou il y a un decor sans qu'il y ait une collision... je sais pas si je suis clair ?
    Effectivement, avec un système de pixel perfect et des plans inclinés, cela ne peut pas fonctionner, alors il vaut mieux revenir sur la première solution.

    Jc

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Si tu utilises la STL , les std::vector ont pour avantage un accès direct à un élément tandis que pour std::list il faut balayer la liste et tester si on accède au bon élément.
    En revanche les std::list seraient + performants à balayer que std::vector

Discussions similaires

  1. Liste de tableau de chaine de caractère
    Par johnnydepp dans le forum C
    Réponses: 2
    Dernier message: 25/02/2007, 12h26
  2. Transformer une liste en tableau
    Par basket dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/09/2006, 16h01
  3. [Tableaux] Liste et tableau de PHP
    Par jive dans le forum Langage
    Réponses: 1
    Dernier message: 03/09/2006, 15h01
  4. difference entre vector, deque, list et tableau
    Par salseropom dans le forum SL & STL
    Réponses: 8
    Dernier message: 03/01/2005, 13h35
  5. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47

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