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/readdirまたはFindFirstFile/FindNextFileを使用)、ディレクトリ内の各ファイル名をループします。各ファイル名を指定するLoadImage()と、結果を呼び出して配列に追加できます。

この手法では、事前にファイル名を知っている必要はありません。

于 2009-10-11T19:42:02.740 に答える
0

そのディレクトリ内のすべてのファイルを自動的にロードするのはどうですか?

foo_ani = LoadImages("Animations/");

指定されたディレクトリをトラバースして、その中にあるすべてのファイルをロードするだけです。

プレフィックスが異なる複数のアニメーションがある場合の別の解決策は、正規表現を使用することです。そのため、または次のようにboostを使用することをお勧めしますstd::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 に答える