SDL或C ++中是否有任何设施允许您从文件夹中读取图像文件而不指定其名称,例如按顺序读取它们等等?如果没有,你用什么技术来完成同样的事情?
做这样的事情:
foo_ani[0] = LoadImage("Animations/foo1.png");
foo_ani[1] = LoadImage("Animations/foo2.png");
foo_ani[2] = LoadImage("Animations/foo3.png");
可能变得相当繁琐,并且不能使用循环,因为每次文件名都是特定的。
我能想到的唯一方法是使用一个字符串,你可以通过每个循环迭代器修改它,并将循环数插入字符串的特定部分,假设你的文件是如何标记的,并使用该字符串作为LoadImage参数。这似乎比做上述工作更有效。
答案 0 :(得分:2)
此处显示的小程序列出目录files/
中的所有文件,与模式fileN.type
匹配,其中N为0及以上,未指定。
#include <iostream>
#include <sstream>
#include <string>
#include <boost/filesystem.hpp>
using namespace std;
namespace fs = boost::filesystem;
int main(int argc, char** argv)
{
fs::path dir ("./files");
string prefix = "file";
string suffix = "type";
int i = 0;
fs::path file;
do {
stringstream ss;
ss << prefix << i++ << "." << suffix;
file = fs::path(dir / fs::path(ss.str()));
if(fs::exists(file)) {
cout << file.leaf() << " exists." << endl;
}
} while(fs::exists(file));
return 0;
}
与-lboost_filesystem
链接。
boost::filesystem
还提供了一个简单的目录迭代器。
答案 1 :(得分:1)
对于这种情况,您通常会获得目录中的文件名列表(根据需要opendir
/ readdir
或FindFirstFile
/ FindNextFile
),并循环目录中的每个文件名。给定每个文件名,您可以调用LoadImage()
并将结果追加到数组中。
此技术不要求您提前知道文件名。
答案 2 :(得分:0)
如何自动加载该目录中的所有文件?
foo_ani = LoadImages("Animations/");
只需遍历给定的目录并加载适合的所有文件。
另一种解决方案,如果你有几个不同前缀的动画是使用正则表达式。我建议您使用boost或std::tr1::regex
,如下所示:
foo_ani = LoadImageSet("Animations/", std::tr1::regex("foo*.png"));
答案 3 :(得分:0)
鉴于您目前正在对帧的名称进行硬编码,我将假设您知道/可以控制文件的命名方案。我也假设你想要它们顺序,因为它似乎是动画中的帧。最后,我假设您知道有多少帧,因为您似乎有一个足够大的阵列可以容纳所有准备好的等待。
考虑到问题中提供的文件的名称,你不能只做FindFirst / FindNext,因为一旦你超过10帧,它们几乎肯定会出现故障(鉴于提供的命名方案)
所以我认为你是对的,最好的方法是循环,但错误的是它比手工做更多的努力。
char* fname = new char[50]; // buffer big enough to hold filenames
int numFrames = 8; // or however many, you seem to know what this value should be
for(int i = 0; i < numFrames; ++i)
{
sprint(fname, "Animations/foo%d.png",(i+1));
foo_ani[i] = LoadImage(fname);
}
delete[] fname;
大约有6行代码。因此,对于超过6帧的动画,我会说这更容易。