Skip to content
Reputeless edited this page Aug 12, 2016 · 62 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++ について知りたい方は [こちら](http://www.slideshare.net/Reputeless/c11c14))

完成への最短距離

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

図形と文字
```cpp # include

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

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

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

}


<img src="https://github.com/Siv3D/Reference-JP/blob/master/resource/siv3d/top2.gif?raw=true" width="320" height="240" align="left">
ペイント<br clear="left">
```cpp
# 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();
	}
}
ブロックくずし
```cpp # include

void Main() { const Size blockSize(40, 20); const double speed = 8.0; Rect wall(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);
	wall.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 && wall.intersects(ball))
	{
		ballSpeed = Vec2((ball.x - wall.center.x) / 8, -ballSpeed.y).setLength(speed);
	}

	ball.draw();
	wall.draw();
}

}


<img src="https://github.com/Siv3D/Reference-JP/blob/master/resource/siv3d/top4.gif?raw=true" width="320" height="240" align="left">
対象定規<br clear="left">
```cpp
# 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();
	}
}
イラストから顔を検出
イラスト提供: [古古米](http://www.pixiv.net/member.php?id=583587) さん ```cpp # include

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

}


<img src="https://github.com/Siv3D/Reference-JP/blob/master/resource/siv3d/top6.gif?raw=true" width="320" height="240" align="left">
オーディオスペクトラム<br clear="left">
```cpp
# 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
```cpp # include

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

}


<img src="https://github.com/Siv3D/Reference-JP/blob/master/resource/siv3d/top8.gif?raw=true" width="320" height="240" align="left">
地球<br clear="left">
```cpp
# 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. さらに学ぶには

表現テクニック集

入出力デバイス

開発のヒント

Clone this wiki locally