Siv3D
Siv3DDay 5

Siv3D のコードを短くする

Siv3D でコードを短く読みやすくするために知っておきたい Tips を紹介します。

1. RGB の省略

グレー

before.cpp
rect.draw(Color(127, 127, 127));
after.cpp
rect.draw(Color(127));
// または
rect.draw(ColorF(0.5));

半透明

before.cpp
texture.draw(ColorF(255, 255, 255, 127));
after.cpp
texture.draw(Alpha(127));
// または
texture.draw(AlphaF(0.5));

2. 画面と同じ大きさの Rect

before.cpp
const Rect rect(0, 0, Window::Width(), Window::Height());
after.cpp
const Rect rect = Window::ClientRect();

3. 正方形

before.cpp
const Rect rect(200, 300, 80, 80);

const Rect rect2(0, 0, 80, 80);
after.cpp
const Rect rect(200, 300, 80);

const Rect rect2(80);

4. 一回り大きい / 小さい Rect

before.cpp
const Rect rect2(rect.x - 10, rect.y - 5. rect.w + 20, rect.h + 10);
after.cpp
const Rect rect2 = rect.stretched(10, 5);

5. 指定した条件を満たす要素の削除

before.cpp
Array<Vec2> v;

for (auto it = v.begin(); it != v.end();)
{
    if (it->y < 0)
    {
        it = v.erase(it);
    }
    else
    {
        ++it;
    }
}
after.cpp
Array<Vec2> v;

Erase_if(v, [](const Vec2& p) { return p.y < 0; });

OpenSiv3D では

after.cpp
Array<Vec2> v;

v.remove_if([](const Vec2& p) { return p.y < 0; });

6. たくさんの数値の文字列化

before.cpp
font(L"ステージ ", stage, L" 得点: ", score, L" タイム: ", time, L" 評価: ", result).draw(); 
after.cpp
font(L"ステージ {} 得点: {} タイム: {} 評価: {}"_fmt, stage, score, time, result).draw(); 

OpenSiv3D では

after.cpp
font(L"ステージ {} 得点: {} タイム: {} 評価: {}"_fmt(stage, score, time, result)).draw(); 

7. ストップウォッチを即座にスタート

before.cpp
Stopwatch stopwatch;

stopwatch.start();
after.cpp
Stopwatch stopwatch(true);

8. emplace_back()

before.cpp
Array<Vec3> v;

v.push_back(Vec3(0.1, 0.2, 0.3));
after.cpp
Array<Vec3> v;

v.emplace_back(0.1, 0.2, 0.3);

9. 画像の全ピクセルへのアクセス

before.cpp
for (int32 y = 0; y < image.height; ++y)
{
    for (int32 x = 0; x < image.width; ++x)
    {
        image[y][x].r = 0;
    }
}
after.cpp
for (auto& pixel : image)
{
    pixel.r = 0;
}

10. 時刻や日付の文字列化

before.cpp
const Date today = Date::Today();

font(today.month, L"月", today.day, L"日").draw();
after.cpp
const Date today = Date::Today();

font(today.format(L"M月d日")).draw();

11. 確率

before.cpp
if (Random(1.0) < 0.33)
{

}
after.cpp
if (RandomBool(0.33))
{

}

12. draw の戻り値

before.cpp
const Rect rect(200, 200, 300, 100);

rect.draw(Palette::Orange);

rect.drawFrame(2, 0, Palette::White);
after.cpp
const Rect rect(200, 200, 300, 100);

rect.draw(Palette::Orange).drawFrame(2, 0, Palette::White);

Siv3D でこのコードをもっと短く書きたい!というリクエストは、OpenSiv3D の GitHub issue や Siv3D Slack で受け付けています。