2012 年に最初のバージョンが公開された Siv3D (以下、現行版 Siv3D) を、より実用的でモダンな設計に置き換えるため、2016 年 3 月に OpenSiv3D プロジェクトがスタートしました。
OpenSiv3D は以下の目標のもと開発が進められています。
- オープンソース化
- クロスプラットフォーム対応
- 最新の C++17 規格に基づいたコードへのアップデート
- 現行版 Siv3D から得た知見やユーザからのリクエストに基づく API デザインの一新
- 多数の新機能追加
OpenSiv3D はまだ開発途中で、一般リリースの段階ではありません。現行版 Siv3D に習熟し、次世代の機能にいち早く触れてみたいユーザは、GitHub から開発中のバージョンを試すことができます。
OpenSiv3D リポジトリ: https://github.com/Siv3D/OpenSiv3D
対応プラットフォーム
OpenSiv3D の対応プラットフォームは、当初は Windows と macOS のみでしたが、2016 年 10 月に、有志による Linux 版のリポジトリが登場し、2017 年 3 月の v0.0.8 で Linux 版が本家リポジトリに試験的に統合されました。現在最新版の v0.1.7 では Windows / macOS / Linux において、ほぼ共通のコードで同じ機能が利用できるようになっています。
開発状況
配列や文字列、図形などの基本クラス、簡単な 2D 描画、オーディオ再生、ファイル処理などが実装されています。一方で、ゲームパッドや Kinect, LeapMotion などのデバイス管理、GUI や 3D グラフィックス、通信など、未実装の機能が多数あるため、現行版の Siv3D アプリを OpenSiv3D に移植するのはまだ難しいです。
筆者が開発しているビジュアルプログラミング言語 Enrect は最新版の OpenSiv3D で開発されているので、現時点でどれほどのことができるかを知る参考になります。
おもな新機能
細かいクラスや関数を含めると、OpenSiv3D にはすでに 500 以上の新機能が実装されています。
ここではとくに、ゲームやアプリの開発に役立つ機能をいくつか紹介します。
絵文字描画
2200 種類以上の Unicode 絵文字を Texture や Font として読み込み、描画できるようになりました。
動物や食べ物の絵文字を、簡単なゲームを作る際の素材としても活用できます。
Glyph
Font を描画する際に、文字単位ごとに色や描画位置を制御できるようになりました。
簡単なマークアップ言語の作成にも応用が可能です。
アイコン描画
Font Awesome によって提供されている 600 種類以上のアイコン を Texture として読み込み、描画できるようになりました。
時計のアイコンや歯車のアイコン、フォルダのアイコンなど、高品質なアイコンセットを活用して、アプリの UI のクオリティを改善できます。
Array クラスのメンバ関数
動的配列 Array
クラスに多くのメンバ関数が追加されました。
配列から先頭の要素を削除する Array::pop_front()
, 指定した条件を満たす要素数をカウントする Array::count_if()
, 配列内の要素をランダムに並び替える Array::shuffle()
など、開発でよく使う便利な操作が簡単に実現できます。
名前付き引数
Arg::??? = ...
または Arg::???(...)
という構文で、疑似的な名前付き引数の仕組みを実装しました。
関数のオーバーロードのバリエーションが増え、例えば Rect
のコンストラクタは、左上の座標を指定するだけでなく、中心座標を指定するもの、右下の座標を指定するもの、上辺の中心位置を指定するものなど、オーバーロードが充実し、細かいところに手が届く仕様にパワーアップしました。
const Rect r(Arg::center(30, 30), 40, 50);
Rect(Arg::topCenter(40, 200), 100, 50).draw();
今後の予定
現在 OpenSiv3D v0.2 世代が GitHub の u_update ブランチで開発中です。v0.2 の目玉機能は以下の通りです。
- 全体的なコードのクリーンアップ
- すべてのプラットフォームで文字表現を char32 に統一
- Placeholder オブジェクトの導入
- VS2017 15.5 や Xcode 9 で可能になった最新の C++14/17 規格への対応
- テキストファイル処理の強化
文字表現を char32 に統一することで、𩸽
や 🐈
のように、これまで 16bit の wchar_t
型では扱えなかった文字単位の処理が可能になります。一方で、文字や文字列リテラルのプレフィックスは従来の L""
から U""
に変更されるので、注意が必要です。
Placeholder オブジェクト s3d::Lambda::_
は、ラムダ式の記述を簡略にする機能です。
using Lambda::_;
const Array<int32> v = { 10, 20, 30, 40 };
const size_t count = v.count_if(_ < 30);
また、戻り値を処理すべきあらゆる関数に [[nodiscard]]
がつけられ、誤って戻り値を無視するコードがコンパイル時に警告されるようになります。
Vec2 v(2.0, 1.5);
v.normalized(); // 警告
Vec2 v2 = v.normalized(); // OK
v.normalize(); // OK
v0.2 のリリース以降もアップデートを重ね、2018 年の春までには現行版 Siv3D の主要な機能の移植を終える目標です。
OpenSiv3D の開発に参加する
OpenSiv3D の開発にあたっては、不定期で開催される「OpenSiv3D 実装会」の参加者や Siv3D Slack の #open-siv3d チャンネルのメンバーを中心に、様々な新機能の提案や実装が進められています。Advent Calendar 11 日目の記事で紹介される「トランプ描画機能」も、そうしたユーザからの実装案が採用されたケースです。
OpenSiv3D の開発に参加するのは簡単で、
- OpenSiv3D の GitHub issue に機能の提案や実装を投稿する
-
Siv3D Slack の
#open-siv3d
チャンネルに参加して発言する - Twitter で不定期に告知される OpenSiv3D 実装会 に参加する1
などの方法があります。
開発コミュニティはまだ人数が少なくメンバーを募集中です。OpenSiv3D 実装会ではコードのレビューや開発のメンタリングなど、C++/Siv3D プログラミング技術の習得支援も行っています。オープンソース開発を通してプログラミング能力を磨きたい方など、ぜひ参加してみてください。
-
次回の開催は 2018 年 2 月を予定しています。 ↩