Siv3D のちょっとした便利機能


Siv3D Advent Calendar 2016 25 日目の記事です。
Siv3D のあまり知られていない便利機能を紹介します。

1. ログに画像を出力

LOG( ) で出力できるのは文字列や数値だけではありません。

# include <Siv3D.hpp>

void Main()
{
    while (System::Update())
    {
        if (Dragdrop::HasItems())
        {
            if (const Image image{ Dragdrop::GetFilePaths()[0] })
            {
                LOG(image);
            }
        }
    }
}

自分のプログラムで実行時に画像がちゃんと生成されているかをデバッグウィンドウから確認したいときに使えます。
同時に HTML ログには縮小された画像が出力されます。Logger::SetMaxImageSize()Logger::SetImageQuality() を使うと、HTML 出力時の画質や画像サイズを設定できます。

2. 標準入出力

Console::Open() を使うとコンソールウィンドウが開き、C++ 標準入出力の std::cout, std::cin が使えます。

# include <Siv3D.hpp>

void Main()
{
    Console::Open();

    std::cout << "数を入力してください > ";

    int32 n;

    std::cin >> n;

    Console::Close();

    const Font font(80);

    while (System::Update())
    {
        font(n).drawAt(Window::Center());
    }
}

String の入出力には std::wcout, std::wcin を使います。

# include <Siv3D.hpp>

void Main()
{
    Console::Open();

    std::wcout << L"名前を入力してください >";

    String name;

    std::wcin >> name;

    Console::Close();

    const Font font(80);

    while (System::Update())
    {
        font(name).drawAt(Window::Center());
    }
}

3. コマンドライン引数を受け取る

エクスプローラ上でアプリに別のファイルをドロップして起動した場合、2 番目のコマンドライン引数以降にそれらのファイルパスが格納されます。
アプリのアイコンに画像をドロップするとそれが表示されるプログラムは次のように作れます。

# include <Siv3D.hpp>

void Main()
{
    const Array<FilePath> args = CommandLine::Get();

    Texture texture;

    if (args.size() >= 2)
    {
        texture = Texture(args[1]);
    }

    while (System::Update())
    {
        if (texture)
        {
            texture.draw();
        }
    }
}

4. 日付と時刻のフォーマット

Date::format()DateTime::format() は、日付や時刻をいい感じに文字列化してくれます。
現在時刻にもとづいて、ユニークなテキストファイルを作りたい場合は次のようにします。
yyyy 等のフォーマットルールはヘッダのドキュメントを参照してください。

# include <Siv3D.hpp>

void Main()
{
    const FilePath path = L"Save/"
        + DateTime::Now().format(L"yyyy-MM-dd_HHmmss_SSS")
        + L".txt";

    TextWriter writer(path);
}

今年も Siv3D Advent Calendar が完走できました。
皆様、良いお年をお迎えください。