OpenSiv3D の機能紹介[1]

  • 12
    Like
  • 0
    Comment

Window と macOS に対応する次世代 Siv3D 「OpenSiv3D」 の開発がオープンソースで進行中です。
OpenSiv3D は Siv3D の公開から 4 年間で積み上げてきた知見と技術をもとにゼロベースから設計を見直し、これまで以上に短いコードと便利な機能を実現する計画です。

現在の最新バージョンは 2016 年 12 月 14 日にリリースされた OpenSiv3D 0.0.5 です。
現時点では低レイヤ部分の実装がメインで、まだ画面への描画や音楽の再生はできませんが、リンク先の SDK をインストールすれば、通常の Siv3D Package のように簡単にインストールし、実装されている機能を試せます。

今回の記事ではその中からいくつかの面白い機能を紹介します。
これだけではゲームやアプリ開発にどう便利なのかイメージがつきにくいかもしれませんが、のちのち開発が進めばその威力が発揮されます。楽しみにしていてください。

0 から 100 までの合計を求める

Log << Range(0, 100).sum(); // 5050

0 から 100 のうち 20 未満の個数を調べる

Log << Range(0, 100).count_if(LessThan(20)); // 20

100 の階乗 (100!)

Log << Range(1, 100).reduce1(Multiplies<BigInt>());
// 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

111122223333 以上の素数を小さい順に 5 つ探す

Log << InfiniteList(111122223333).filter(IsPrime).take(5);
// {111122223337,111122223347,111122223353,111122223361,111122223367}

0 から 9 の数をシャッフル

従来
Array<int32> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Shuffle(v);

Log(v); // {8,4,3,7,0,5,6,2,9,1}
OpenSiv3D
const Array<int32> v = Range(0, 9).asArray().shuffle();

Log << v; // {8,4,3,7,0,5,6,2,9,1}

文字列フォーマット

従来
int32 time = 20;
Log(L"残り時間 {} 秒"_fmt, time); // 残り時間 20 秒
OpenSiv3D
int32 time = 20;
Log << L"残り時間 {} 秒"_fmt(time); // 残り時間 20 秒

中心が (30, 30), 大きさが (40, 50) の長方形を作る

従来
const Rect r = Rect(40, 50).setCenter(30, 30);
OpenSiv3D
const Rect r(Arg::center(30, 30), 40, 50);

10 秒経過するまで実行

従来
for (Stopwatch s(true); s.elapsed() < 10s; )
{
    // DoWork();
}
OpenSiv3D
for (Stopwatch s(true); s < 10s; )
{
    // DoWork();
}

コンソールウィンドウから数を入力し、その 2 倍の数をログに出力する

従来
Console::Open();

int32 n;

std::wcin >> n;

Log(n * 2);
OpenSiv3D
Log << Console.read<int32>() * 2;

さいころの結果を 10 個生成

従来
Array<int32> v;

for (int32 i = 0; i < 10; ++i)
{
    v.push_back(Random(1, 6));
}
OpenSiv3D
const Array<int32> v(10, Arg::generator = RNG(1, 6));

このほかに現時点での特筆すべき機能として

  • 実行時のクラッシュの回避 (Windows 構造化例外処理)
  • 新しいファイル圧縮方式 (Zstandard)
  • constexpr 対応の強化
  • マルチスレッド処理の強化

が挙げられます。

OpenSiv3D の今後のアップデートにご期待ください。
開発への参加は Siv3D Slack #open-siv3d チャンネル にてお待ちしています。