Home > Back-end >  Passing class member object - SFML draw()
Passing class member object - SFML draw()

Time:11-01

It seems like a very weird situation. I just want to draw a sf::Text object that is handle outside the main loop (in another class).

I show you only the essential. This code works (it draws other things that are handle directly in the main) and so it compiles.

Main :

int main()
{

//we handle the creation of the window //
//...

//Example where the sf::Text is handle in the main (it works)
sf::Font font;
font.loadFromFile("arial.ttf");
sf::Text mainTxt("It works !!",font);
mainTxt.setPosition(sf::Vector2f(64,"It works !!"));
mainTxt.setCharacterSize(25);
mainTxt.setFillColor(sf::Color::Blue);

TextManager textManager(); //My class that don't work...    

sf::Event event;
while (window.isOpen())
{
    // We handle event (we don't care here)
    // ... 
    
    window.draw(mainTxt); // it works
    window.draw(textManager.getMyText()); // do nothing

    window.display();
    window.clear();

}

return 0;

}

TextManager header :

#ifndef TEXTMANAGER_H
#define TEXTMANAGER_H

#include <SFML/Graphics.hpp>

class TextManager 
{
    public:
        TextManager();
        virtual ~TextManager();
        sf::Text getMyText();

    private:
         sf::Text myText;
};

#endif // TEXTMANAGER_H

TextManager cpp

#include "TextManager.h"

TextManager::TextManager()
{
    sf::Font font;
    font.loadFromFile("arial.ttf");
    sf::Text myText("Not drawn on the screen :-(",font);
    myText.setPosition(sf::Vector2f(164,0));
    myText.setCharacterSize(25);
    myText.setFillColor(sf::Color::Blue);
}

// in this example (that do not work) I do not change fspText. But, I want to update         it at each call of the get function. So, it is not a constant class member.
sf::Text TextManager::getMyText() {        
    return myText;
}

TextManager::~TextManager()
{
    //dtor
}

What I really do not understand, is the fact that with a custom class of mine, I can access a class member object with this type of getter. I also did some research, and I think It should return a copy of the sf::Text object. I try lot of things, like return reference or const reference etc... I do not understand.

I hope my problem is well displayed. Thank you for your help ;-) And have a nice day !

CodePudding user response:

This

TextManager textManager(); //My class that don't work...  

is function declaration, not construction of object. Should be:

TextManager textManager; //My class that don't work...  

By

sf::Text myText("Not drawn on the screen :-(",font);

you define a local variable called myText the same as your data member. So, myText returned by getMyText is just not affected.


Read the docs before coding:

It is important to note that the sf::Text instance doesn't copy the font that it uses, it only keeps a reference to it. Thus, a sf::Font must not be destructed while it is used by a sf::Text (i.e. never write a function that uses a local sf::Font instance for creating a text).

taken from SFML reference.

class TextManager 
{
    public:
        TextManager();
        virtual ~TextManager();
        sf::Text& getMyText(); // <- pass by reference
    private:
         sf::Font myFont;
         sf::Text myText;
};

and

TextManager::TextManager()
{
    myFont.loadFromFile("arial.ttf");
    myText.setString("Not drawn on the screen :-(");
    myText.setFont(myFont);
    myText.setPosition(sf::Vector2f(164,0));
    myText.setCharacterSize(25);
    myText.setFillColor(sf::Color::Blue);
}

might work.

  • Related