Siv3D でコードを短く読みやすくするために知っておきたい Tips を紹介します。動作バージョンは OpenSiv3D v0.6.3 です。
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(Color{ 255, 255, 255, 127 });
after.cpp
texture.draw(Alpha(127));
// または
texture.draw(AlphaF(0.5));
2. シーンと同じ大きさの Rect
before.cpp
const Rect rect{ 0, 0, Scene::Width(), Scene::Height() };
after.cpp
const Rect rect = Scene::Rect();
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;
v.remove_if([](const Vec2& p) { return (p.y < 0); });
6. たくさんの数値の文字列化
before.cpp
font(U"ステージ ", stage, U" 得点: ", score, U" タイム: ", time, U" 評価: ", result).draw();
after.cpp
font(U"ステージ {} 得点: {} タイム: {} 評価: {}"_fmt(stage, score, time, result)).draw();
7. ストップウォッチを即座にスタート
before.cpp
Stopwatch stopwatch;
stopwatch.start();
after.cpp
Stopwatch stopwatch{ StartImmediately::Yes };
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(U"{}月{}日"_fmt(today.month, today.day)).draw();
after.cpp
const Date today = Date::Today();
font(today.format(U"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 で受け付けています。