進捗報告合宿

Siv3D Advent Calendar 2013, 22 日目の記事です。
今日は未踏の首藤 / 石黒 PM チーム合同の進捗報告合宿に来ています。

おもに 10 - 12 月の間に実装した機能や、現在の課題について発表、議論しました。
発表順が 2 番目だったので気楽に過ごせてます。


10 月の未踏ブースト合宿と違ってシングル部屋なのが嬉しい。

未踏 OB とのディスカッションで、Siv3D の今後の方向性に関わるアドバイスをいただきました。オープンソースマーケティングが来年の重要テーマになりそうです。

Siv3D Winter of Code 2013

Google Summer of Code を真似てみました。

Siv3D Advent Calendar 2013, 21 日目の記事です。
今日は Siv3D を使うクリエイターのみなさんに冬休みの宿題です。

今度リリースする Siv3D January 2014 の新機能に「正多角形や星形を作成する関数」というものがあります。六角形や星形のポリゴンをつくるとき、いちいち頂点ごとに座標を指定しなくてすむものです。

その関数を実装するという課題を CodeIQ に出題しました。
C++ と Siv3D に慣れていれば 30 分程度でできると思います。
CodeIQ | Siv3D でポリゴンを作ろう!

挑戦した方には、

  • コードのフィードバック
  • このブログに名前を掲載
  • ???

といった特典があります。
CodeIQ に登録して最初に解くのがこの問題だった方には、おまけがあります。

比較的簡単な問題なので CodeIQ 未経験の方にも優しいと思います。コードが公開されることはありません。時間も計測されないのでゆっくり考えられます。期限は今月 30 日までです。

Play Siv3D! の拡充

Siv3D Advent Calendar 2013, 20 日目の記事です。
今日は Siv3D の Web サイト整理のお話です。

これまで 5 年間にわたって Siv3D の開発記録や機能紹介を発信してきた Google Site の Siv3D ページ を縮小し、今後は Play Siv3D! に情報を集約することにしました。

1つのサイト内で Siv3D について知り、試し、学べるようにするのが目的です。
旧サイトは Play Siv3D!, 開発ブログ, Qiita などへのリンクをまとめるサイトになります。

今月末には Play Siv3D! に Siv3D Advent Calendar 25 日分の記事をマージし、ドキュメントをさらに充実させるほか、バグ報告フォームやアンケートページを用意して、ユーザーからの意見を開発に反映しやすくします。

それともう一つ、別の企画が進行中です。これは一両日中にアナウンスする予定です。December 2013 をインストールして待っていてください!

アイコンを変更する

Siv3D Advent Calendar 2013, 19 日目の記事です。
今日は December 2013 の新機能、アプリケーションのアイコンを変更する機能を紹介します。

アプリケーションのデフォルトのアイコンは、プロジェクトフォルダにある icon.ico を新しいアイコンに置き換えることで変更できます。

実行時にアイコンを変更する場合は Window::SetIcon(Image) を使います。アイコンに使える画像のサイズは 32x32 で、それ以外の場合は自動で拡大縮小されます。
クリックされた回数をアイコンに表示させてみましょう。

# include <Siv3D.hpp>

void Main()
{
	const Font font(18);
	
	Image image(64, 64, Palette::White);

	int count = 0;

	while (System::Update())
	{
		if (Input::MouseL.clicked)
		{
			++count;

			image.fill(Palette::White);

			Circle(32, 32, 28).write(image, Palette::Seagreen);

			font.writeCenter(image, Format(count), { 32, 32 }, Palette::White);

			Window::SetIcon(image);
		}
	}
}

数フレームごとにアイコンを変更すればアニメーションもできます。

Skype のアイコンのように、何らかの情報をアイコンで通知するといった使い方もできるでしょう。

テキストの領域を取得する

Siv3D Advent Calendar 2013, 18 日目の記事です。
今日はテキストが描画される領域を計算する機能を紹介します。

Font::region() を使うと、Font::draw() したときにテキストが描かれる領域をあらかじめ RectF で取得できます。領域に応じて、テキストの位置や背景を決めるといった使い方ができます。

# include <Siv3D.hpp>

void Main()
{
	Window::SetPos(770, 386);

	const Font font(16);

	const std::array<String,3> messages =
	{
		L"かがくの ちからって すげー!",
		L"いまや すうじゅうぎょうの\nシープラスプラスの プログラムだけで",
		L"ゲームや おんがくプレイヤーが\nつくれるんだと",
	};

	int count = 0;

	while (System::Update())
	{
		if (Input::MouseL.clicked)
		{
			++count %= messages.size();
		}
		
		Circle(100, 300, 80).draw();

		const String message = messages[count];

		const RectF region = font.region(message);

		const Vec2 pos(150, 150 - region.h);

		(region + pos).stretched(50, 15).draw(Palette::Seagreen);

		Triangle({ 200, 165 }, { 280, 165 }, { 180, 220 })
			.draw(Palette::Seagreen);

		font.draw(message, pos);
	}
}

画像をログファイルに出力する

Siv3D Advent Calendar 2013, 17 日目の記事です。
今日は画像をログファイルに出力する機能を紹介します。

Logger::Write(image) を使うと Image をログファイルに出力できます。
画像の情報は直接 HTML ファイル内に埋め込まれます。

# include <Siv3D.hpp>

void Main()
{
	Image image(L"Example/Windmill.png");

	Logger::Write(image);

	Logger::Write(image.mirror());
}

ログファイルのサイズ削減のために、デフォルトでは画像は最大幅 128px に縮小、JPEG (quality=75) 圧縮されます。
サイズの最大値を変更したい場合は Logger::SetImageSize(maxSize),
画像の圧縮品質を変えたい場合は Logger::SetImageQuality(quality)
を使います。
quality を 100 にすると、画像は JPEG ではなく PNG 圧縮されるので劣化しません。

図形のグラデーション

Siv3D Advent Calendar 2013, 16 日目の記事です。
今日は December 2013 の新機能、図形のグラデーションを紹介します。

グラデーションに対応したのは Line / Rect / Triangle / Quad の 4 つの図形です。draw() メソッドで、単一の Color の代わりに { } を使って頂点色のリストを渡します。

# include <Siv3D.hpp>

void Main()
{
	while (System::Update())
	{
		Line({ 20, 20, 300, 40 }).draw(5.0,
		{ Palette::Red, Palette::Yellow });

		Triangle(450, 200, 250).draw(
		{ Color(255), Color(255, 0, 0), Color(0, 255, 0) });

		Rect(50, 50, 200, 200).draw(
		{ Palette::Blue, Palette::Blue, Palette::White, Palette::White });

		Quad({ 200, 300 }, { 400, 300 }, { 500, 400 }, { 100, 400 }).draw(
		{ Alpha(255), Alpha(255), Alpha(0), Alpha(0) });
	}
}

Rect と Quad は頂点分割の都合上 2 頂点 - 2 頂点以外のグラデーションが綺麗に出せないことがあるので注意してください。