SFML белый прямоугольник - PullRequest
       12

SFML белый прямоугольник

0 голосов
/ 07 января 2020

Я пытаюсь сделать простую карту тайлов. У меня проблема: когда я настраиваю карту, появляются только белые квадраты. Обычно я загружаю текстуру, поэтому я не знаю, почему это так.

Вот код:

class Tile
{
private:
sf::Sprite sprite;
sf::Texture tex;

public:
     Tile(int x, int y, sf::Texture tex)
    {
this->tex = tex;
this->sprite.setTexture(this->tex);
this->sprite.setPosition(x, y);

    }
    void render(sf::RenderWindow* target)
    {
    target->draw(this->sprite);
    }


class Tilemap
{
private:
Tile tiles[36][64];
sf::Texture tex[4];

public:
//const/dest
Tilemap()
{
this->tex[0].loadFromFile("Resources/Tilemap/Water/water1.png");

int x = -WIDTH+WIDTH/2;
int y = -HEIGTH/2;
for (int i = 0; i < 36; i++)
{
    for (int j = 0; j < 64; j++)
    {
        this->tiles[i][j] = Tile(x, y, this->tex[0]);
        x += 60;
    }
    y += 60;
    x = -WIDTH + WIDTH / 2;
}

}


render(sf::RenderWindow* target, sf::Vector2f pos)
{
for (int i = 0; i < 34; i++)
{
    for (int j = 0; j < 64; j++)
    {
        this->tiles[i][j].render(target);
    }
}
 };
 Tilemap map;
 map = Tilemap();

1 Ответ

2 голосов
/ 07 января 2020

У вас есть свисающая ссылка в sprite.

Эта свисающая ссылка появляется в следующей строке:

this->tiles[i][j] = Tile(x, y, this->tex[0]);

Что означает ссылка о Sprite::setTexture ?

Аргумент текстуры относится к текстуре, которая должна существовать до тех пор, пока ее использует спрайт. Действительно, спрайт не хранит свою собственную копию текстуры, а хранит указатель на тот, который вы передали этой функции. Если исходная текстура уничтожена и спрайт пытается ее использовать, поведение не определено.

Где именно проблема?

Tile(x, y, this->tex[0]);

Здесь новый экземпляр Tile создано. tex и sprite являются переменными-членами Tile. И sprite по setTexture относится к tex.

tiles[i][j] = Tile(x,...);

В приведенной выше строке вызывается оператор копирования, который копирует sprite / tex из временного объекта - созданного Tile(x,y,..)). В результате в tiles[i][j] у вас есть sprite член, который ссылается на текстуру временного экземпляра - Tile(..) (sprite просто содержит указатель на текстуру). И, наконец, в конце полного выражения временный экземпляр уничтожается, tex из Tile(..) удаляется, а tiles[i][j].sprite содержит недопустимый указатель на текстуру.

Решение?

Вы необходимо добавить конструктор копирования (оператор назначения копирования) Tile, чтобы правильно инициализировать sprite для хранения его собственного tex (без ссылки на экземпляр, из которого сделана копия):

Например:

 Tile& operator=(const Tile& theOther)
 {
      this->tex = theOther.tex;
      this->sprite.setTexture(this->tex);
      return *this;
 }

в сгенерированном по умолчанию операторе назначения сгенерированной копии this->sprite указывает на theOther.tex текстуру, что неверно.

...