Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RESOLU]Afficher un sprite à partir d'une classe instanciée dans un vector  (Lu 2563 fois)

0 Membres et 1 Invité sur ce sujet

kevin.G

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Je ne comprends pas pourquoi mon sprite ne s'affiche pas, peut on m'aider ? Merci.
Voici le code :
#include <SFML/Graphics.hpp>
#include <iostream>
#include <stdlib.h>

#include "Engine.h"

using namespace sf;
using namespace std;

int main()
{
    Engine engine;
    engine.loadLevel("Golam");
    engine.run();

    return 0;
}
class Engine
{
    public:
        Engine();
        void loadLevel( string name);
        void run();
        void draw();

        virtual ~Engine();

    private:
        vector<Plan> plans;
        Camera camera;
        RenderWindow window;
};

Engine::Engine()
{
    window.create(VideoMode(1280, 720), "Test");
    window.setFramerateLimit(30);
}

void Engine::loadLevel(string name)
{
    Plan plan1("path/plan1.png", 1);
    plans.push_back(plan1);
    cout << "Level Loaded\n";
}

void Engine::run()
{
    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();

            if (event.type == Event::KeyReleased)
            {
                if (event.key.code == Keyboard::Escape)
                {
                    window.close();
                }
            }
        }
        draw();
    }
}

void Engine::draw()
{
    window.clear(Color(100,100,50));
    window.setView(camera.getView());
    window.draw( plans[0].getSprite() );

    window.display();
}
 
#include <SFML/Graphics.hpp>
#include <string>
#include<iostream>

using namespace sf;
using namespace std;

class Plan
{
    public:
        Plan();
        Plan(string path, unsigned int p);
        virtual ~Plan();
        Sprite getSprite();
        int getPriority();
    private:
        Texture texture;
        Sprite sprite;
        unsigned int priority;
};

#include "Plan.h"

Plan::Plan(string path, unsigned int p)
{
    priority = p;
    if (!texture.loadFromFile(path))
    {
        cout << "error texture." << endl;
    }
    sprite.setTexture(texture);
}

Sprite Plan::getSprite()
{
    return sprite;
}

int Plan::getPriority()
{
    return priority;
}

 
« Modifié: Août 23, 2014, 10:07:33 am par kevin.G »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #1 le: Août 22, 2014, 08:54:32 pm »
Quand tu mets un objet dans ton vector, c'est une copie de celui-ci qui est insérée dedans. Donc une copie du sprite et de la texture originaux. Or la copie du sprite va toujours pointer vers la texture originale, qui n'existe plus, au lieu de pointer vers la nouvelle.
Laurent Gomila - SFML developer

kevin.G

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #2 le: Août 22, 2014, 09:16:53 pm »
Il faudrait donc que je creer le plan avant et qu'ensuite je configure sa texture et son sprite après l'avoir ajouter à mon vector ?
« Modifié: Août 22, 2014, 09:31:26 pm par kgervais »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #3 le: Août 22, 2014, 10:11:00 pm »
Ou que tu mettes la texture ailleurs que dans Plan. Ça te permettra d'ailleurs d'avoir 2 plans qui utilisent la même texture sans la charger 2 fois.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #4 le: Août 22, 2014, 10:19:51 pm »
Non. Il faut déjà réflechir à la sémantique de ta classe. Est-ce qu'elle peut être copiée dans tous les sens, ou bien est-ce qu'une instance représente une "entité" et ça n'aurait pas de sens d'en créer des copies si facilement ?

Si ta classe est vouée à être copiable, alors implémente un constructeur par copie et un opérateur d'affectation pour que ses copies soient correctes. Ca peut se faire indirectement : comme c'est la texture qui pose problème, s'en débarasser peut résoudre ton problème ; en la stockant ailleurs (dans un manager ou autre) comme proposé par G.

Si ta classe ne doit pas être copiée, alors fais-la dériver de sf::NonCopyable (par exemple) de sorte que le compilateur te crie dessus quand tu fais des copies non-voulues, comme c'est le cas ici. Ensuite pour éviter les copies tu auras différents mécanismes à ta disposition (std::unique_ptr, vector::emplace_back, std::move, ... (tout ça c'est du C++11)).

Bref, avant de sortir une rustine technique et de tomber sur le prochain problème, prend le temps de réflechir à la conception de tes classes, ça résoudra bien des problèmes potentiels avant qu'ils ne se présentent à toi.
Laurent Gomila - SFML developer

kevin.G

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #5 le: Août 23, 2014, 09:38:32 am »
Comme son nom l'indique, cette classe est senser représenter une série de plans superposable (pour permettre notamment un effet de parallaxe). Dans ce sens, chaque texture sera unique et utiliser dans aucun autre plan.
Quand pensez-vous ?

PS : Merci beaucoup pour vos réponses, je vais essayer de faire du mieux que je peux :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #6 le: Août 23, 2014, 09:48:02 am »
Citer
Quand pensez-vous ?
Le soir, en général.
(désolé)

Plus sérieusement, ce qui serait intéressant c'est de savoir ce que toi tu en penses ;)

Personnellement, moi je rendrais ce genre de classe non copiable, puisque c'est une entité qui a une représentation concrète dans la scène ; et on ne veut pas dupliquer ce genre d'entité implicitement à tout bout de champ.
Laurent Gomila - SFML developer

kevin.G

  • Newbie
  • *
  • Messages: 6
    • Voir le profil
Re : Afficher un sprite à partir d'une classe instanciée dans un vector
« Réponse #7 le: Août 23, 2014, 10:06:47 am »
J'ai du mal à me relire de bon matin ^^'
Merci pour votre réponse en tout cas :)