Partage
  • Partager sur Facebook
  • Partager sur Twitter

C++ : Aide pour mettre un image en fond

    29 mars 2019 à 20:48:26

    Bonjours,

    Je dois actuellement créer un jeux 2d pour un projet de fin d'étude , et j'ai besoin de vous. Je code en c++ avec du SFML. Le problème est que je suis bloqué , je n'arrive pas a trouver des codes ou des explications qui fonctionnent afin de créer un fond d'écran .  Sur le site SFML, j'ai vus que l'on peut utiliser des sprites , j'ai alors copié le code et télécharger la tile mais rien ne se passe . Sauriez vous m'aider car si je n'y arrive pas , je suis mal partit pour mon projet .

    ps : Si vous avez des façons plus facile que le sfml pour le faire, ça me vas aussi , il faut juste que j'arrive a mettre un image même fixe afin de pouvoir continuer.

    Merci d'avance a vous !

    • Partager sur Facebook
    • Partager sur Twitter
      29 mars 2019 à 20:58:08

      Hello,

      Honnêtement ça risque d'être difficile de faire plus simple niveau bibliothèque graphique.

      Fait voir un peu ton code, sans ça on ne pourra pas t'aider.

      -
      Edité par Guit0Xx 29 mars 2019 à 20:58:33

      • Partager sur Facebook
      • Partager sur Twitter

      ...

        29 mars 2019 à 21:21:26

        class TileMap : public sf::Drawable, public sf::Transformable { public: bool load(const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height) { // on charge la texture du tileset if (!m_tileset.loadFromFile(tileset)) return false; // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau m_vertices.setPrimitiveType(sf::Quads); m_vertices.resize(width * height * 4); // on remplit le tableau de vertex, avec un quad par tuile for (unsigned int i = 0; i < width; ++i) for (unsigned int j = 0; j < height; ++j) { // on récupère le numéro de tuile courant int tileNumber = tiles[i + j * width]; // on en déduit sa position dans la texture du tileset int tu = tileNumber % (m_tileset.getSize().x / tileSize.x); int tv = tileNumber / (m_tileset.getSize().x / tileSize.x); // on récupère un pointeur vers le quad à définir dans le tableau de vertex sf::Vertex* quad = &m_vertices[(i + j * width) * 4]; // on définit ses quatre coins quad[0].position = sf::Vector2f(i * tileSize.x, j * tileSize.y); quad[1].position = sf::Vector2f((i + 1) * tileSize.x, j * tileSize.y); quad[2].position = sf::Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y); quad[3].position = sf::Vector2f(i * tileSize.x, (j + 1) * tileSize.y); // on définit ses quatre coordonnées de texture quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y); quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y); quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y); quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y); } return true; } private: virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const { // on applique la transformation states.transform *= getTransform(); // on applique la texture du tileset states.texture = &m_tileset; // et on dessine enfin le tableau de vertex target.draw(m_vertices, states); } sf::VertexArray m_vertices; sf::Texture m_tileset; }; 

        Et maintenant, l'application qui l'utilise :

        int main() { // on crée la fenêtre sf::RenderWindow window(sf::VideoMode(512, 256), "Tilemap"); // on définit le niveau à l'aide de numéro de tuiles const int level[] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0, 0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0, 2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1, }; // on crée la tilemap avec le niveau précédemment défini TileMap map; if (!map.load("tileset.png", sf::Vector2u(32, 32), level, 16, 8)) return -1; // on fait tourner la boucle principale while (window.isOpen()) { // on gère les évènements sf::Event event; while (window.pollEvent(event)) { if(event.type == sf::Event::Closed) window.close(); } // on dessine le niveau window.clear(); window.draw(map); window.display(); } return 0; } 
        Je ne sais pas pourquoi ca c'est mis comme ca mais bon regarde ici : https://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array-fr.php

        -
        Edité par Diazym 29 mars 2019 à 21:22:47

        • Partager sur Facebook
        • Partager sur Twitter
          29 mars 2019 à 21:39:31

          Oula ça va être compliqué de s'y retrouver ^^. Mais j'peux pas t'en vouloir, l'éditeur du forum semble complètement pété (du moins de mon côté).

          Tout ce que je peux te dire c'est que pour une TileMap tu n'as pas de raison particulières d'utiliser les Vertex. Là clairerement tu te compliques la vie.

          Un exemple avec une grille de Rectangle :

          #include <SFML/Graphics.hpp>
          
          sf::RectangleShape createRect(float x, float y, const sf::Vector2f& size)
          {
              sf::RectangleShape rect{size};
              rect.setPosition(x, y);
              rect.setOutlineThickness(1);
              rect.setOutlineColor(sf::Color::White);
              rect.setFillColor(sf::Color::Transparent);
              return rect;
          }
          
          /////////////////////////////////////////////////////////////////////////////////////
          int main()
          {
              //// WINDOW
              const unsigned WIDTH_SCREEN = 1280;
              const unsigned HEIGHT_SCREEN = 720;
              sf::RenderWindow window{sf::VideoMode(WIDTH_SCREEN, HEIGHT_SCREEN), "Untitled"};
          
              std::vector<sf::Rectangleshape> grid{};
          
              const std::size_t rows = 5;
              const std::size_t cols = 5;
              const sf::Vector2f tileSize{32.f, 32.f};
          
              for(std::size_t i = 0; i < rows; ++i){
                  for(std::size_t j = 0; j < cols; ++j){
                      grid.emplace_back(createRect(j*tileSize.y, i*tileSize.x, tileSize));
                  }
              }
          
              //// GAMELOOP
              while (window.isOpen())
              {
                  sf::Event event{};
                  while (window.pollEvent(event)){
                      if (event.type == sf::Event::Closed){
                          window.close();
                      }
                  }
          
                  //// UPDATE
          
                  //// DRAW
                  window.clear();
                  for(const auto& rect : grid){
                      window.draw(rect);
                  }
                  window.display();
              }
          
              return 0;
          }

          Ici j'ai utilisé des rectangles mais tu peux l'adapter avec des sprites à la place.

          -
          Edité par Guit0Xx 29 mars 2019 à 21:45:22

          • Partager sur Facebook
          • Partager sur Twitter

          ...

            29 mars 2019 à 22:07:38

            Wow merci bien mais je ne vois pas vraiment ou l'on charge le sprite, le truc c'est que je ne m'y connais pas trop ^^' .

            -
            Edité par Diazym 29 mars 2019 à 22:21:10

            • Partager sur Facebook
            • Partager sur Twitter
              29 mars 2019 à 22:38:20

              Ah ^^

              Dans ce cas le seul truc que je puisse te conseiller c'est de t'exercer, c'est pas que je ne veuille pas t'aider hein, mais si tu as déjà des doutes avec ce bout de code c'est qu'il te manque certaines bases (C++ ? SFML ?).

              Les mini tutos sur le site de la SFML sont plutôt simples et clairs. Exerce toi à planter un clou avant de construire une maison ;) .

              Après attention, le bout de code que je t'ai donné c'est juste pour initialiser et placer des rectangles/sprites sous forme de grille. Derrière il y a encore un peu de boulot pour créer un système de TileMap.

              -
              Edité par Guit0Xx 29 mars 2019 à 22:49:04

              • Partager sur Facebook
              • Partager sur Twitter

              ...

                29 mars 2019 à 22:47:41

                Le truc c'est que je joue mon année sur se projet et il me reste 1 mois et demis max ...
                • Partager sur Facebook
                • Partager sur Twitter
                  29 mars 2019 à 22:50:03

                  Ba fallait t'y prendre avant :) . C'est peut-être dur d'entendre ça mais c'est pas à nous de combler les trous ;) .

                  Puis ce serait vraiment pas cool de te filer du code tout beau tout propre. C'est quelque chose qui doit venir de toi.

                  -
                  Edité par Guit0Xx 29 mars 2019 à 22:51:37

                  • Partager sur Facebook
                  • Partager sur Twitter

                  ...

                    29 mars 2019 à 22:51:22

                    C'est le seul truc qu'il me manque , mais bon voila merci quand meme ...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mars 2019 à 22:53:01

                      Ba si c'est le seul truc qui te manque, ça devrait le faire tranquille en 1 mois et demi. Suffit de bosser.

                      -
                      Edité par Guit0Xx 29 mars 2019 à 22:53:27

                      • Partager sur Facebook
                      • Partager sur Twitter

                      ...

                        29 mars 2019 à 22:53:46

                        Non car ca fait deja 2 mois je je cherche et je ne trouve rien et aucune aide
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 mars 2019 à 23:06:17

                          Ba fallait demander y'a 2 mois.

                          Puis là à part copier-coller le code de la SFML et dire que tu n'arrivais pas à le faire fonctionner, tu n'as pas montré ton code et tu n'as pas dis non plus ce que tu ne comprenais pas exactement.

                          -
                          Edité par Guit0Xx 29 mars 2019 à 23:06:54

                          • Partager sur Facebook
                          • Partager sur Twitter

                          ...

                            30 mars 2019 à 15:38:53 - Message modéré pour le motif suivant : Inutile


                            Que  l’obscurantisme retourne à l'obscurité....  Tchao

                            C++ : Aide pour mettre un image en fond

                            × 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