Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer une grille 2D avec un rendu en 3D isométrique

    10 juin 2011 à 15:56:26

    Bonjour, je travaille actuellement sur la création d'un jeu en 2D, cependant j'aimerais que ma grille de jeu ne soit pas totalement en 2d mais ait un rendu 3D, un peu à la dofus si vous voulez un exemple. Pour cela j'ai besoin de trouver l'algorithme (de préférence en C#, ou une explication de l'algo) qui me permet de tracer les lignes du cadrillage sur une image bitmap mais je n'ai aucune idée de comment faire. Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2011 à 16:06:23

      Je pense pas que tu devrais te casser la tête avec le traçage des traits, tu peux tout simplement charger des images qui sont en forme de losange et c'est tout.
      Voilà un petit rendu de ce que j'ai pu faire avec cette technique (certes, elle n'est pas très pro mais bon):
      Image utilisateur

      J'ai utilisé XNA et j'ai les moyens de savoir sur quelle case se trouve la souris (collisions) sans utiliser d'algorithme super complet.

      Edit: je crois que tu utilises le GDI+, et il est très lent, je te le recommande pas si tu veux faire même un simple jeu en iso.
      • Partager sur Facebook
      • Partager sur Twitter
        10 juin 2011 à 17:02:40

        Enfait je voudrais caser une image de fond sous la grille, ainsi la grille se dessinerait par dessus cette image de fond donc il faut pour ça que je trace moi la grille. Et au passage, j'utilise silverlight pour mon jeu mais le principe serait le même je pense, ce qu'il me faut c'est l'algo pour dessiner la grille sur une bitmap.
        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2011 à 18:41:33

          Désolé de te dire mais t'es images ne sont pas du tous Pro ^^
          C'était juste un petit passage ^^
          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2011 à 19:51:47

            Bonjour,

            Je serais également intéressé pour faire une map en 3d isométrique avec XNA, l'exemple que nous donne Torshid n'est pas de la 3D ...
            Je pensais faire un cube "type" qui me servirai de modèle, mettre de la texture dessus et les superposer afin de faire une map. Je ne connaissais pas Dofus, mais effectivement, c'est un bon exemple du résultat recherché, si quelqu'un d'autre a une solution ...

            Merci
            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2011 à 20:06:40

              Dofus c'est de la pure 2D il me semble.
              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2011 à 20:51:50

                Je me suis peut être mal exprimé, je veux dire par la, un effet en perspective avec la possibilité de mettre ses propres textures:

                exemple:
                http://www.mondespersistants.com/artic [...] s-alors-:363/

                Je n'ai pas vu ton code pour l'image que tu as posté, mais je pense que ce n'est pas la même approche :)
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juin 2011 à 22:52:08

                  Je vois que le sujet fait polémique :) pour ceux que ça intéresse j'ai trouvé une solution avec XNA (je ne dis pas que c'est la meilleure mais elle marche) : il faut créer un tableau multidimensionnel de nombres qui constituera la map, et à chaque nombre est associé une texture en 2D isométrique soit un losange où la diagonale verticale est deux fois moins grande que la diagonale horizontale. Ensuite c'est juste un bout de code qui permet de placer les "tiles" (carrés ou ici losanges) qui constituent la map. Pour ceux que ça intéresse, je vous mets le code ci-dessous qui permet de placer les tiles quand on a un tableau multidimensionnel d'entiers qui définissent chacun des types de cases :

                  public void PlaceTiles()
                          {
                              for (int i = 0; i < _codeMap.GetLength(0); i++) //On parcourt les lignes du tableau
                              {
                                  for (int j = 0; j < _codeMap.GetLength(1); j++) //On parcourt les colonnes du tableau
                                  {
                                      if (_codeMap[i, j] != -1)
                                      {
                                          Vector2 pos = new Vector2();
                                          if (i != 0)
                                          {
                                              if (i % 2 != 0 || i == 1) //Si le numéro de ligne est impair
                                              {
                                                  pos.X = ((j * lengthx + lengthx / 2) + (((i - 1) * lengthx) / 2)) - j * lengthx / 2 + _posDepart.X;
                                                  pos.Y = (((i * lengthy) / 2)) - j * lengthy / 2 + _posDepart.Y;
                                              }
                                              else //Sinon s'il est pair
                                              {
                                                  pos.X = (j * lengthx + ((i * lengthx) / 2)) - j * lengthx / 2 + _posDepart.X;
                                                  pos.Y = (((i * lengthy) / 2)) - j * lengthy / 2 + _posDepart.Y;
                                              }
                                          }
                                          else //Si il est égal à zéro (même code que s'il est pair)
                                          {
                                              pos.X = (j * lengthx) - j * lengthx / 2 +_posDepart.X;
                                              pos.Y = (((i * lengthy) / 2)) - j * lengthy / 2 + _posDepart.Y;
                                          }
                                          _tabTile[i, j] = new Tile(_codeMap[i, j], pos, new Vector2(i, j)); //Rajout de la Tile dans un tableau d'objet de type "Tile" qui est une classe que j'ai crée
                                      }
                                  }
                              }
                          }
                  


                  Ainsi un code de map de ce type :



                  int[,] code_map = new int[,] {
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
                                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
                              };
                  


                  donnera cette map :

                  Image utilisateur

                  Ne faites pas attention au rectangle rouge qui est mon personnage et aux deux carrés bleus qui sont des mobs (abstraits certes :p ) mais plutôt à la disposition des tiles par rapport au code de la map (les deux "2" dans le code sont les deux tiles rouges que vous pouvez identifier sur l'écran. Voilà, en espérant avoir pu aider certains d'entre vous qui se poseraient des questions. Par ailleurs je suis en train de rédiger un cours sur des notions avancées du C#, si vous avez des idées de chapitres à me soumettre MP moi, il est prévu que je rédige une partie entière sur la création d'un jeu avec XNA (sûrement un RPG en 2D isométrique). En attendant, j'espère que les premiers chapitres que j'ai envoyé cette après midi sortiront bientôt et vous plairont !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Créer une grille 2D avec un rendu en 3D isométrique

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown