Reputeless edited this page Mar 17, 2017 · 57 revisions

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

Siv3D は C++ で楽しく簡単にインタラクティブなアプリケーションを作れるライブラリです。2D / 3D グラフィックスやオーディオを自在にコントロールし、Kinect や Leap Motion, カメラやマイクといった様々なデバイスを使った複雑なインタラクションを短いコードで書けます。

すぐに、なんでも、新しく

アプリケーション開発を楽しむための最良のツールです。


短いコード

数行~数十行のコードでインタラクティブなアプリケーションを開発できます。短時間で結果が得られるため、大学や専門学校のプログラミング教育でも活用されています。

音や画像を扱う豊富な機能

音楽の再生や画像の表示、テンポやピッチの変更、波形編集、画像加工、AR マーカーの検出、Twitter への画像投稿といった様々な処理を易しいコードで実現します。

10 種類以上の入力機器

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

最新の C++ 規格

すべてのコードが最新の C++11/14 規格で書かれているため、Siv3D を使うことで新しい C++ の書き方を学習できます。(最新の C++ について知りたい方は こちら)

完成への最短距離

洗練されたコードで、あらゆるアイデアを明快に表現します。

図形と文字
# 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);
    }
}
ペイント
# 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();
	}
}
ブロックくずし
# include <Siv3D.hpp>

void Main()
{
	const Size blockSize(40, 20);
	const double speed = 8.0;
	Rect bar(60, 10);
	Circle ball(320, 400, 8);
	Vec2 ballSpeed(0, -speed);

	Array<Rect> blocks;
	for (auto p : step({ Window::Width() / blockSize.x , 5 }))
	{
		blocks.emplace_back((p*blockSize).moveBy(0, 60), blockSize);
	}

	while (System::Update())
	{
		ball.moveBy(ballSpeed);
		bar.setCenter(Mouse::Pos().x, 420);

		for (auto it = blocks.begin(); it != blocks.end(); ++it)
		{
			if (it->intersects(ball))
			{
				(it->bottom.intersects(ball) || it->top.intersects(ball)
					? ballSpeed.y : ballSpeed.x) *= -1;

				blocks.erase(it);
				break;
			}
		}

		for (auto const& block : blocks)
		{
			block.stretched(-1).draw(HSV(block.y - 40));
		}

		if (ball.y < 0 && ballSpeed.y <  0)
		{
			ballSpeed.y *= -1;
		}

		if ((ball.x < 0 && ballSpeed.x < 0) || (Window::Width() < ball.x && ballSpeed.x > 0))
		{
			ballSpeed.x *= -1;
		}

		if (ballSpeed.y > 0 && bar.intersects(ball))
		{
			ballSpeed = Vec2((ball.x - bar.center.x) / 8, -ballSpeed.y).setLength(speed);
		}

		ball.draw();
		bar.draw();
	}
}
対象定規
# include <Siv3D.hpp>

void Main()
{
	const int32 N = 12;

	Image image(Window::Size(), Color(20, 40, 60));

	DynamicTexture texture(image);

	Mouse::SetTransform(Mat3x2::Translate(Window::Center()));

	while (System::Update())
	{
		if (Input::MouseL.pressed)
		{
			for (auto i : step(N))
			{
				Circular cs[2] = { Input::MouseL.clicked ? Mouse::Pos() : Mouse::PreviousPos(), Mouse::Pos() };

				for (auto& c : cs)
				{
					c.theta = i % 2 ? -c.theta - TwoPi / N * (i - 1) : c.theta + TwoPi / N * i;
				}

				Line(cs[0], cs[1]).moveBy(Window::Center()).overwrite(image, 2, HSV(System::FrameCount(), 0.5, 1.0));
			}

			texture.tryFill(image);
		}
		else if (Input::MouseR.clicked)
		{
			image.fill(Color(20, 40, 60));

			texture.fill(image);
		}

		texture.draw();
	}
}
イラストから顔を検出
イラスト提供: 古古米 さん
# include <Siv3D.hpp>

void Main()
{
	Texture texture;

	Array<Rect> faces;

	while (System::Update())
	{
		if (Dragdrop::HasItems())
		{
			if (Image image{ Dragdrop::GetFilePaths()[0] })
			{
				faces = Imaging::DetectFaces(image, CascadeType::Anime);

				texture = Texture(image);

				Window::Resize(texture.size);
			}
		}

		texture.draw();

		const double a = Sin(Time::GetMillisec() * 0.005) * 0.5 + 0.5;

		for (const auto& face : faces)
		{
			face.drawFrame(3, 3, ColorF(Palette::Red, a));
		}
	}
}
オーディオスペクトラム
# include <Siv3D.hpp>

void Main()
{
	const Sound sound = Dialog::OpenSound();

	sound.play();

	while (System::Update())
	{
		const auto fft = FFT::Analyze(sound);

		for (auto i : step(320))
		{
			RectF(i * 2, Window::Height(), 2, -Pow(fft.buffer[i], 0.6) * 1000).draw(HSV(240 - i));
		}
	}
}
Kinect
# 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);
				}
			}
		}
	}
}
地球

# 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);
	}
}

Siv3D について

サポート

入門チュートリアル

  1. Siv3D の基本
  2. 図形を描く
  3. テクスチャを描く
  4. テキストを描く
  5. 文字列と数値の変換
  6. キーボード入力
  7. マウス入力
  8. サウンドの再生
  9. MIDI の再生
  10. ウィンドウと背景
  11. 図形のあたり判定
  12. 乱数
  13. ダイアログ
  14. ドラッグ & ドロップ
  15. アプリの状態
  16. テキストファイル
  17. INI, CSV, JSON
  18. バイナリファイル
  19. GUI
  20. アセット管理
  21. 画像編集
  22. Web カメラ
  23. マイク入力
  24. 経過時間の測定
  25. HSV カラー
  26. ファイルダウンロード
  27. 3D 描画
  28. 2D のレンダーステート
  29. 3D のレンダーステート
  30. パーティクル
  31. スクリーンショット
  32. アプリケーションの公開
  33. さらに学ぶには

リファレンス

学習コース

表現テクニック集

入出力デバイス

サンプル

開発のヒント

管理用 [記事編集ガイドライン](https://github.com/Siv3D/Reference-JP/wiki/記事編集ガイドライン)
Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.