Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Soren Usulian le Mars 13, 2013, 06:15:44 pm

Titre: [Résolu] Problème avec un vector de classes + sprites
Posté par: Soren Usulian le Mars 13, 2013, 06:15:44 pm
Bonjour à tous, ça fait quelques jours que je bloque sur un soucis, alors peut être j'ai mal pensé mes classes mais je n'arrive plus à avancer, en fait j'ai ma fenêtre qui s'ouvre à la fin de la compilation et qui est noire comme si il n'y avait pas de sprite.

Voici deux fonctions qui sont utilisé dans le main :

int Map::loadTiles() // Creation of instance of tile
    {
        int x(0), y(0), i(0), numberOfTiles(0);
        sf::Texture texture;
        if(!texture.loadFromFile("texture.png"))
            return EXIT_FAILURE;

        for(y=0;y <= 384; y = y + 32)// Y
            {
                for(x=0;x <= 800; x = x + 32)// X
                {
                    listTiles.push_back(new Tile (x,y));
                    log << "x = " << x << " ; y = " << y <<endl;
                    i++;
                }
            }
        return 0;
    }
 

int Map::displayTiles() // Displaying of tiles
    {
        int i(0), numberOfTiles(0);
        numberOfTiles = ceil((384/32)*(800/32));
        sf::RenderWindow window(sf::VideoMode(800, 600), "Map");
        while (window.isOpen())
        {
            sf::Event event;
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                    window.close();
            }
            window.clear();

            for(i=0;i <= numberOfTiles; i++) // Draw all the tiles
            {
                listTiles[i]->getSprite().setPosition(listTiles[i]->getCoordinates());
                window.draw(listTiles[i]->getSprite());
            }

            window.display();
        }

    }

 

Merci d'avance.
Titre: Re : Problème avec un vector de classes + sprites
Posté par: G. le Mars 14, 2013, 03:32:52 am
Ta sf::Texture est détruite à la fin de sa portée.
Est-ce que getSprite renvoie une référence ?
Titre: Re : Problème avec un vector de classes + sprites
Posté par: Soren Usulian le Mars 14, 2013, 06:34:16 pm
 Bah, j'ai pensé pour ma texture et je viens de résoudre partiellement mon problème : j'ai mis dans ma classe temporairement une texture qui se charge à la construction des instances de mes tiles, comme ceci :
    Tile::Tile(int x, int y) : m_coordinates(x, y)
    {
        m_texture.loadFromFile("texture.png");
        m_sprite.setPosition(m_coordinates);
        m_sprite.setTexture(m_texture);
    }
 

mais si je ne positionne pas mon sprite à la construction, il ne se positionne pas quand je les affiche :
 int Map::displayTiles() // Displaying of tiles
    {
        int i(0), numberOfTiles(0);
        numberOfTiles = ceil((384/32)*(800/32));
        sf::RenderWindow window(sf::VideoMode(800, 600), "Map");
        while (window.isOpen())
        {
            sf::Event event;
            while (window.pollEvent(event))
            {
                if (event.type == sf::Event::Closed)
                    window.close();
            }
            window.clear();

            for(i=0;i < numberOfTiles; i++) // Draw all the tiles
            {
                listTiles[i]->getSprite().setPosition(listTiles[i]->getCoordinates()); // C'est donc ici le soucis
                window.draw(listTiles[i]->getSprite());
            }

            window.display();
        }

 
Titre: Re : Problème avec un vector de classes + sprites
Posté par: mccusti le Mars 15, 2013, 09:49:21 am
Il faut que getSprite() retourne une référence. Dans ton code le setPosition() s'effectue sur une copie temporaire et non sur le sprite original.
Titre: Re : Problème avec un vector de classes + sprites
Posté par: Soren Usulian le Mars 15, 2013, 10:22:59 am
Oui, c'est ce que je viens de faire, j'ai redéfini ma fonction getSprite() et ça marche mieux, merci beaucoup.