Play Siv3D!

ゲームとメディアアートのための C++ ライブラリ「Siv3D」

Siv3D

Siv3D は C++ で楽しく簡単にゲームやメディアアートを作れるライブラリです。Kinect や Leap Motion, カメラやマイクといった多くのデバイスに対応し、複雑なインタラクションを短いコードで書くことができます。2008 年から開発を始め、2012 年に α 版を公開、2013 年 9 月には IPA 未踏事業に採択 (2013 年度スーパークリエータ認定) 、2014 年 9 月に CEDEC に出展、2016 年 9 月に最新版 Siv3D August 2016 v2 をリリースしました。これまで 様々なゲームやアプリケーション が Siv3D で開発されています。現在 macOS/Linux に対応する マルチプラットフォーム版 を開発中です。

News

Siv3D Advent Calendar 2016 を開催しました 2016.12.25
・最新版 Siv3D August 2016 v2 をリリースしました 2016.9.1
・Siv3D August 2016 をリリースしました 2016.8.27
新リファレンス がオープンしました 2016.8.10
・早稲田大学にて中高生向けの Siv3D 体験講座プログラミング自習・相談スペース を実施しました 2016.7.31
Siv3D Game Jam 開催中

Features

短いコード、少ない学習コスト
数行~数十行のコードで、音や画像を扱うインタラクティブなアプリケーションを開発できます。 短時間で面白い結果が得られるため、プログラミング教育での活用にも適しています。

音や画像のための豊富な機能
基本的な音楽再生や描画の機能に加え、テンポやピッチを変更する波形編集、顔や AR マーカーの検出、Twitter への画像投稿といった応用的な画像・音声処理を易しいコードで実現できます。

10 種類以上の入力デバイスに対応
Kinect, Leap Motion, マイク、Web カメラ、ペンタブレット、ゲームコントローラ、マルチタッチ、Arduino など、10 種類以上の入力デバイスを、わずか 2, 3 行のコードの追加で活用できます。


最新の C++ を学べる
ライブラリやサンプルはすべて最新の C++11/14 規格で書かれています(最新の C++ について知りたい方は こちら)。Siv3D を使うことで新しい C++ の書き方を学習できます。

すぐに始められる
Siv3D をインストールすると Visual Studio のプロジェクト作成メニューに Siv3D の項目が追加されます。ダウンロードから最速 30 秒でサンプルをビルド・実行できる簡単セットアップです。

サポートとコミュニティ
リファレンスには 300 以上のサンプルコードが掲載され、随時更新されています。使い方に困ったときにはフォーラムや Twitter でサポートを受けられます。ユーザのための勉強会も開いています。


わずか数行のコードから、グラフィカルでインタラクティブなアプリケーションが生まれます。

# include <Siv3D.hpp>

void Main()
{
	const Font font(30);

	while (System::Update())
	{
		Circle(Mouse::Pos(), 100).draw();

		font(Mouse::Pos()).draw(50, 200, Palette::Orange);
	}
}

対応する画像形式は 10 種類。画像ビューアも簡単に作れます。

# include <Siv3D.hpp>

void Main()
{
	const Texture texture(L"Example/Windmill.png");

	while (System::Update())
	{
		texture.draw(100, 50);
	}
}

お絵かきソフトを作るのも朝飯前です。ペンの色や太さを変えたり、画像を加工・保存する機能も、数行コードを追加すれば実装できます。

# include <Siv3D.hpp>

void Main()
{
    Image image(Window::Size(), Palette::White);

    DynamicTexture texture(image);

    while (System::Update())
    {
        if (Input::MouseL.pressed)
        {
            Line(Mouse::PreviousPos(), Mouse::Pos()).overwrite(image, 8, Palette::Orange);

            texture.fill(image);
        }

        texture.draw();
    }
}

点、線分、長方形、円、三角形、四角形、多角形など様々な図形型が用意されています。あたり判定や包含判定はたった 1 行で記述できます。

# include <Siv3D.hpp>

void Main()
{
	const Rect rect(20, 20, 200, 100);

	const Circle circle(150, 300, 100);

	const Polygon star
	{
		{ 430, 100 }, { 470, 240 },
		{ 610, 240 }, { 505, 325 },
		{ 545, 460 }, { 430, 380 },
		{ 315, 460 }, { 355, 325 },
		{ 250, 240 }, { 390, 240 }
	};

	while (System::Update())
	{
		const Circle player(Mouse::Pos(), 30);

		rect.draw(player.intersects(rect) ? Palette::Red : Palette::Yellow);

		circle.draw(player.intersects(circle) ? Palette::Red : Palette::Yellow);

		star.draw(player.intersects(star) ? Palette::Red : Palette::Yellow);

		player.draw();
	}
}

Kinect や Leap Motion といった最新デバイスを驚くほど簡単に扱えます。プレイヤーのアクションを使ったゲームを今すぐ作り始められます。

# include <Siv3D.hpp>

void Main()
{
    KinectV2::Start();

    DynamicTexture depthTexture;

    std::array<Optional<KinectV2Body>, 6> bodies;

    while (System::Update())
    {
        if (KinectV2::HasNewDepthFrame())
        {
            KinectV2::GetDepthFrame(depthTexture);
        }

        if (KinectV2::HasNewBodyFrame())
        {
            KinectV2::GetBodyFrame(bodies);
        }

        depthTexture.draw();

        for (const auto& body : bodies)
        {
            if (body)
            {
                for (const auto& joint : body->joints)
                {
                    Circle(joint.depthSpacePos, 15).drawFrame(6.0, 0.0, Palette::Red);
                }
            }
        }
    }
}

5 分もあれば音楽プレイヤーを作ることができます。コードは Qiita | Siv3D で音楽プレイヤーを作る で紹介しています。

3D グラフィックスを表現するのに難しい知識は必要ありません。シーンには最大 128 個の光源を置くことができ、フォグやパーティクルを使ったエフェクトの演出ができます。

# include <Siv3D.hpp>

void Main()
{
    const Texture texture(L"Example/Earth.jpg", TextureDesc::For3D);

    while (System::Update())
    {
        Graphics3D::FreeCamera();

        const double yaw = Time::GetMillisec() * -0.0001;

        Sphere(10, Quaternion::Yaw(yaw).roll(-23.4_deg)).draw(texture);
    }
}