Белая текстура вместо фактической текстуры, когда не используется динамическая память в SFML - PullRequest
0 голосов
/ 07 июня 2018

У меня есть класс Armor, который хранит текстуру и спрайт, которые будут отображаться на экране, например:

Armor.h

class Armor 
{
public:
    Armor(const std::string& armorName);

    void draw(sf::RenderWindow& window);

    ~Armor();

private:
    sf::Texture armorTexture;
    sf::Sprite armorSprite;
    int numOfArmor;
};

Armor.cpp

#include "Armor.h"
Armor::Armor(const std::string& armorName)
{
    armorTexture.loadFromFile(armorName);
    armorSprite.setTexture(armorTexture);
    numOfArmor = 0;
}


void Armor::draw(sf::RenderWindow& window)
{
    window.draw(armorSprite);
}

Armor::~Armor()
{
}

У меня также есть объект с именем Application, который хранит экземпляр Armor на карте, например:

Application.h

class Application
{
public:
    Application();

    void start();

    ~Application();
private:
    sf::RenderWindow window;
    std::map<std::string, Armor> armorMap;
    std::map<std::string, Armor>::iterator armorIter;

};

Application.cpp

#include "Application.h"

Application::Application()
{
    window.create(sf::VideoMode(640, 480), "SFML Application", sf::Style::Close);
    window.setFramerateLimit(120);

    std::string armorName;
    std::ifstream file("Armors.txt");
    while (file >> armorName)
        armorMap.emplace(armorName, Armor(armorName + "Armor.png"));
    file.close();

    armorIter = armorMap.begin();
}

void Application::start()
{
    while (window.isOpen())
    {

        sf::Event evnt;
        while (window.pollEvent(evnt))
        {

            if (evnt.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        while (armorIter != armorMap.end())
        {
            armorIter->second.draw(window);
            armorIter++;
        }
        armorIter = armorMap.begin();
        window.display();
    }
}

Application::~Application()
{
}

Всякий раз, когда я строю объект, на экране появляется белая текстура, которая, как я выяснил, известна как проблема белой текстуры .Я был в замешательстве, потому что уверен, что моя текстура не была уничтожена, поэтому я решил вместо этого изменить карту на std::map<std::string, Armor*> armorMap, и это исправило все мои проблемы!Зачем хранить указатель на объект типа Armor на карте, а не так, как я это делал изначально?

1 Ответ

0 голосов
/ 07 июня 2018

Когда вы сохраняете свой объект брони на карте, вы делаете его копию, текстуру и спрайт.

Спрайт сохранил вашу текстуру как указатель на исходный объект текстуры, который был уничтожен (см. https://www.sfml -dev.org / Documentation / 2.5.0 / classsf_1_1Sprite.php # a3729c88d88ac38c19317c18e87242560 ).

Хранение указателей на карте в любом случае даст вам гораздо лучшую производительность, поскольку вы избежитененужные текстурные копии.Вы, вероятно, должны использовать std::shared_ptr<Armour> вместо необработанных указателей, если вы действительно не знаете, что делаете.

...