在 SFML 中不使用动态内存时显示白色纹理代替实际纹理
White texture showing in place of actual texture when not using dynamic memory in SFML
我有一个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
类型的对象的指针会起作用,而不是我最初的方式?
当你将你的盔甲物品存储到地图中时,你正在复制它,它的纹理和它的精灵。
精灵已将您的纹理存储为指向被销毁的原始纹理对象的指针(请参阅 https://www.sfml-dev.org/documentation/2.5.0/classsf_1_1Sprite.php#a3729c88d88ac38c19317c18e87242560(。
无论如何,在地图中存储指针都会给你带来更好的性能,因为你会避免不必要的纹理副本。您可能应该使用std::shared_ptr<Armour>
而不是原始指针,除非您真的知道自己在做什么。
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- OpenGL 混合会在纹理周围创建白色边框
- 在 SFML 中不使用动态内存时显示白色纹理代替实际纹理
- OpenGL GLSL 纹理函数始终返回 vec4(1,1,1,1),白色三角形
- 现代OpenGL,在对象上获得白色纹理
- 为什么 SFML 加载的是白色方块而不是纹理
- SFML中的白色方块,角色和纹理存储在不同的对象中
- 纹理在 opengl 中显示为白色
- stb图像加载库返回白色纹理
- 在OpenGL中绘制完全白色纹理
- OpenGL显示白色纹理
- SFML中的白色正方形,但纹理加载良好