1

SDL 或 C++ 中是否有任何工具允许您从文件夹中读取图像文件而无需指定其名称,例如按顺序读取它们等?如果没有,您是否使用任何技术来完成相同的事情?

做这样的事情:

foo_ani[0] = LoadImage("Animations/foo1.png");
foo_ani[1] = LoadImage("Animations/foo2.png");
foo_ani[2] = LoadImage("Animations/foo3.png");

可能会变得非常乏味,并且不能使用循环,因为文件名每次都是特定的。

我真正想到的唯一方法可能是通过每个循环迭代器修改一个字符串,并将循环号插入字符串的特定部分,假设这是您的文件的标记方式,并将该字符串用作 LoadImage 参数。不过,这似乎比仅做上述工作要多。

4

4 回答 4

2

使用boost::filesystem.

此处显示的小程序列出了目录中的所有文件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还提供了一个简单的目录迭代器。

于 2009-10-11T19:49:53.910 回答
1

对于这种情况,您通常会获取目录中的文件名列表(根据需要使用opendir/readdirFindFirstFile/ FindNextFile),然后循环遍历目录中的每个文件名。给定每个文件名,您可以调用LoadImage()并将结果附加到您的数组中。

这种技术不需要您提前知道文件名。

于 2009-10-11T19:42:02.740 回答
0

如何自动加载该目录中的所有文件?

foo_ani = LoadImages("Animations/");

只需遍历给定的目录并加载适合的所有文件。

另一种解决方案,如果您有多个具有不同前缀的动画,则使用正则表达式。我建议您为此使用booststd::tr1::regex,如下所示:

foo_ani = LoadImageSet("Animations/", std::tr1::regex("foo*.png"));
于 2009-10-11T19:43:43.783 回答
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 帧的动画,我会说这更容易。

于 2009-10-11T20:06:17.373 回答