我正在为学校做一些sfml项目,老师只想要.exe程序。我正在使用Visual Studio 2017.在这个项目中,我使用.jpg文件中的纹理
sf::RenderWindow window(sf::VideoMode(640, 480, 32), "Kurs SFML ");
sf::Texture texture;
texture.loadFromFile("wood.jpg");
sf::Sprite pic;
pic.setTexture(texture);
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(pic);
window.display();
此文件(wood.jpg)需要与项目在同一文件夹中显示此纹理,否则它只显示黑屏。当我检查另一个文件夹中的.exe程序时,它还需要此文件位于此文件夹中,或者.exe显示黑屏。但我的老师只想要没有任何文件夹的.exe文件。那么有可能做一些事情不包括这个文件(wood.jpg),但在.exe中显示纹理?
将纹理嵌入可执行文件中。
一个简单的解决方案是编写一个小工具来读取文件并写出一个包含原始字节的constexpr std::array
的C ++源文件。然后从链接到可执行文件的该变量(SFML具有从内存加载资源的函数)加载纹理。
编写这样的工具不应该超过10-20行代码。
对于SFML特定的解决方案,您可以执行此操作。
sf::Image tmp;
tmp.loadFromFile("super.jpeg");
std::ofstream file;
file.open("textarray.cpp");
size_t psize = tmp.getSize().x * tmp.getSize().y * 4;
auto ptr = tmp.getPixelsPtr();
file << "sf::Uint8 imageArray[] = {" << (int)ptr[0];
for (size_t i = 1; i<psize; ++i)
file << "," << (int)ptr[i];
file << "};";
file.close();
这将创建一个文件名textarray.cpp,其中包含类似于sf::Uint8 imageArray[] = {...};
的内容
然后你可以像这样在你的程序中加载它。
sf::Uint8 imageArray[] = {...};
sf::Image img;
img.create(80, 80, imageArray); // Replace 80, 80 with width and height of your image!!!
sf::Texture texture;
texture.loadFromImage(img);
sf::Sprite sprite;
sprite.setTexture(texture);
从这里开始,就像正常一样绘制精灵。