Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SFML] Tile mapping

Sujet résolu
    15 août 2018 à 13:57:03

    Bonjours,

    Je suis en train de creer un moteur de jeu avec la sfml pour des jeux en 2d mais j'ai un probleme de concernant les tiles. C'est assez bizarre en faite😅. Je vous donne le code et je vous explique

    mon code : 

    Map.cpp

    #include "Map.h"
    #include <fstream>
    
    Map::Map(std::string const& tileSetPath) : m_tileSet(), m_array_map(), m_imageTileSet()
    {
    	if (m_imageTileSet.loadFromFile(tileSetPath.c_str())) 
    	{
    		m_tileSet.loadFromImage(m_imageTileSet);
    	}
    	else
    	{
    		std::cout << "Erreur chargement tuiles";
    	}
    }
    
    void Map::loadMapFromFile(std::string const & filepath)
    {
    	char a;
    
    	std::ifstream fichier("nivo/"+filepath+".txt");
    	if (fichier)
    	{
    		for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
    		{
    			for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
    			{
    				fichier.get(a);
    				if (a != 10)
    				{
    					m_array_map[i][j] = a - 48;
    				}
    			}
    		}
    	}
    	for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
    	{
    		for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
    		{
    			std::cout << m_array_map[i][j] << "|";
    		}
    	}
    }
    
    void Map::drawMap(sf::RenderWindow & window)
    {
    	sf::Sprite sprite_tile;
    	sprite_tile.setTexture(m_tileSet);
    	std::cout << std::endl << std::endl;
    	for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
    	{
    		for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
    		{
    			std::cout << m_array_map[i][j] << "|";
    			sprite_tile.setPosition(sf::Vector2f(float(i*32), float(j*32)));
    			sprite_tile.setTextureRect(sf::IntRect(m_array_map[i][j] * 32, 0, 32, 32));
    			window.draw(sprite_tile);
    		}
    	}
    }
    

    Map.h

    #include <string>
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include <array>
    
    #define LARGEUR_TILE 32
    #define HAUTEUR_TILE 32
    
    #define NOMBRE_BLOCS_LARGEUR 10
    #define NOMBRE_BLOCS_HAUTEUR 10
    
    typedef std::array<std::array<int, NOMBRE_BLOCS_LARGEUR>, NOMBRE_BLOCS_HAUTEUR> ArrayMap;
    
    class Map
    {
    public:
    	Map(std::string const& tileSetPath);
    	void loadMapFromFile(std::string const& filepath);
    	void drawMap(sf::RenderWindow& window);
    
    private:
    	sf::Image m_imageTileSet;
    	sf::Texture m_tileSet;
    	ArrayMap m_array_map;
    };
    

    Main.cpp

    #include <SFML/Graphics.hpp>
    
    
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include "Map.h"
    
    
    int main()
    {
    	sf::RenderWindow window(sf::VideoMode(NOMBRE_BLOCS_HAUTEUR * HAUTEUR_TILE, NOMBRE_BLOCS_LARGEUR * LARGEUR_TILE), "Titre");
    
    	Map map1("tiles/tileset.png");
    	map1.loadMapFromFile("nivo1");
    	window.clear();
    	map1.drawMap(window);
    	window.display();
    
    
    	while (window.isOpen())
    	{
    		sf::Event event;
    		while (window.pollEvent(event))
    		{
    			if (event.type == sf::Event::Closed)
    				window.close();
    		}
    
    	}
    
    	return 0;
    }

    Tileset.png : 

    En gros ce code ne marche qu'a moitie il marchait bien et d'un seul coup ben il marchait plus avec ce nivo : 

    nivo.txt :

    2222200000
    2222000111
    2200011100
    2000110000
    0000100000
    0000100000
    0000100002
    0001100022
    0001000222
    0001000222

    Du coup je me suis dit que j'allais enlever les saut de ligne tel :

    2222200000222200011122000111002000110000000010000000001000000000100002000110002200010002220001000222

    Et la ça marche bien ( pour l'instant :p ) mais je voudrais pouvoir mettre les saut de ligne car meme si c'est pour un editeur de jeu je voudrais que si jamais je dois aller modifier manuellement la map ben je puisse donc que dois-je faire

    EDIT : Ce code ne vient pas exclusivement de moi je l'ai pris sur internet (je crois sur ce forum) et je l'ai modifie




    -
    Edité par samuel | coopyso 15 août 2018 à 13:58:15

    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2018 à 15:28:05

      Salut !

      Les retours à la ligne ne sont pas codés de la même manière suivant les systèmes d'exploitation.

      https://fr.wikipedia.org/wiki/Fin_de_ligne

      Pour ne pas lire les valeurs des retours à la ligne, vérifie plutôt que ton caractère acsii est bien entre 48 et 57.

      remplace la ligne 28 de ton Map.cpp par:

      if(a>47 && a < 58)

      Ca devrait marcher.

      • Partager sur Facebook
      • Partager sur Twitter
        15 août 2018 à 16:01:01

        Je ne peux pas faire sa puisque a est un valeur superieur a 48 (48 = 0 dans le fichier)
        • Partager sur Facebook
        • Partager sur Twitter
          15 août 2018 à 16:45:09

          Si tu peux, ou alors tu ne comprends pas ce que tu fais.

          Tu as fait une autre erreur, c'est que tu continues d'avancer dans ta matrice même si le caractère lu est invalide. Du coup tout se décale. Cela fonctionne chez moi :

          fichier.get(a);
          while(a < 48 || a > 57)
          {
              fichier.get(a);
          }
          m_array_map[i][j] = a - 48;
          



          -
          Edité par Umbre37 15 août 2018 à 16:45:44

          • Partager sur Facebook
          • Partager sur Twitter
            15 août 2018 à 17:26:41

                if (fichier)
                {
                    for (int i(0); i < NOMBRE_BLOCS_HAUTEUR; i++)
                    {
                        for (int j(0); j < NOMBRE_BLOCS_LARGEUR; j++)
                        {
                            fichier.get(a);
                            std::cout << a << "|";
                        }
                    }
                }

            Ton code marche super bien merci beaucoup mais pourquoi le code ci dessus m'affiche que des valeur comprise entre 48 et 51 (sans les /n) ?

            De plus aurait tu eventuellement un code plus optimisé

            -
            Edité par samuel | coopyso 15 août 2018 à 17:27:13

            • Partager sur Facebook
            • Partager sur Twitter
              15 août 2018 à 18:22:16

              Cela doit t'afficher des 0, 1, 2 pas des 48 49 50.

              Ensuite niveau optimisation, tu dois changer la manière dont tu stockes tes données. Tu fais comment si tu as plus de 10 tiles différentes ?

              Le pire du pire c'est que tu crées tous les sprites et tu calcules leurs positions sur la fenêtre et sur la texture à chaque frame ! C'est de la folie :) niveau optimisation.

              Et pourquoi diable passer par une sf::Image pour charger ta texture ? Ca c'est un gaspillage énorme aussi.

              -
              Edité par Umbre37 15 août 2018 à 18:29:29

              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2018 à 18:53:16

                D'accord je vais voir comment faire pour changer mais entre temps j'ai deja change le premier point que tu as dit c'est optimise de ce point de vue.

                Autre question qui n'a pas de rapport avec les precedantes question : est ce qu'il existe des fenetre comme sa :

                • Partager sur Facebook
                • Partager sur Twitter
                  15 août 2018 à 19:40:48

                  Je ne sais pas. Avec Qt certainement. Tu peux aussi faire une GUI toi même avec la SFML. Mais c'est bcp de boulo, et quel serait l'intérêt... ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 août 2018 à 8:34:05

                    Salut,

                    Sous Windows, la fenêtre "Enregistrer sous" est standard :

                    http://fvirtman.free.fr/recueil/04_01_02_getopenfilename.c.php


                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      16 août 2018 à 12:24:51

                      Salut,

                      Merci je vais tester ce que tu m'a dit ça me sauve car qt j'aime bien mais j'aurais preferer ne pas l'utiliser et surtout car il marche pas tres bien on m'a dit sous vs 2017 donc merci

                      • Partager sur Facebook
                      • Partager sur Twitter

                      [SFML] Tile mapping

                      × 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