SFML white rectangle(SFML白色矩形)
本文介绍了SFML白色矩形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试制作一张简单的平铺地图。我有一个问题:当我设置地图时,只有白色方块。我通常加载纹理,所以我不知道为什么会这样。
代码如下:
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();
推荐答案
您在sprite
中有悬空引用。
此悬空引用出现在以下行中:
this->tiles[i][j] = Tile(x, y, this->tex[0]);
reference关于Sprite::setTexture
说了什么?
纹理参数引用的纹理必须存在于 精灵使用它。事实上,精灵并没有存储它自己的副本 纹理,而是保留指向您传递到的纹理的指针 此函数。如果源纹理被破坏,而精灵尝试 若要使用它,行为是未定义的。
问题具体在哪里?
Tile(x, y, this->tex[0]);
这里创建了Tile
的新实例。tex
和sprite
是Tile
的成员变量。sprite
bysetTexture
指的是tex
。
tiles[i][j] = Tile(x,...);
在上面的行中,调用了复制赋值操作符,该操作符从临时对象复制sprite
/tex
,由Tile(x,y,..)
创建)。因此,在tiles[i][j]
中,您有sprite
成员,它引用临时实例的纹理-Tile(..)
(sprite
只持有指向纹理的指针)。最后,在完整表达式的末尾销毁临时实例,删除Tile(..)
的tex
,并且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
纹理,这是错误的。
这篇关于SFML白色矩形的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:SFML白色矩形
基础教程推荐
猜你喜欢
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 设计字符串本地化的最佳方法 2022-01-01