c++ - 在 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>
除非您真的知道自己在做什么,否则您可能应该使用而不是原始指针。
推荐阅读
- python - knn 算法 - 类型错误:manhattan_dist() 缺少 1 个必需的位置参数
- python-3.x - 坐标系变换
- javascript - jQuery 在调用 .submit() 方法时触发了提交事件
- javascript - CodeceptJs:找不到带有某些字符的元素
- python - 使用数据框更改绘图 Seaborn Facetgrid 中同一行的线型
- intellij-idea - Intellij 重构,禁用/自定义生成“@org.jetbrains.annotations.NotNull”
- c# - .Net Core 中的数据注释只是客户端还是它们也验证服务器端?
- c# - 更新资产文件 (C#/UWP)
- python - 为什么 PyCharm 将当前文件和父目录添加到路径中?
- c# - 在 Xamarin.Forms 中弹出多个模式的过程是什么?