ペンタブレットを使う

Siv3D Advent Calendar 2013, 9 日目の記事です。
今日はペンタブレット入力の機能を紹介します。

※この記事は Siv3D December 2013 に基づいています。最新の Siv3D のコードは
リファレンス | ペンタブレット で入手できます。

主要な関数は 3 つです。
地面に対するペンの傾きを取得する Pentablet::DegreeXZ()
垂直な軸まわりのペンの回転角度を取得する Pentablet::DegreeY()
筆圧を取得する Pentablet::Pressure()

座標やクリックは Mouse::Pos() や Input::MouseL / MouseR に反映されます。

# include <Siv3D.hpp>

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

	if (!Pentablet::SupportsPressure())
	{
		return; // 筆圧測定に対応していない
	}

	while (System::Update())
	{
		// 地面に対する傾き [0, 90]
		const int degreeXZ = Pentablet::DegreeXZ();

		// 垂直な軸まわりの回転角度 [0, 359)
		const int degreeY = Pentablet::DegreeY();

		// 筆圧 [0.0, 1.0]
		const double pressure = Pentablet::Pressure();

		Circle(Mouse::Pos(), pressure * 200).draw(Palette::Skyblue);

		Circle(Mouse::Pos() + Circular(pressure * 200, Radians(degreeY)), 20).draw(Palette::Red);

		font.draw(Format(
			L"XZ: ", degreeXZ, L'\n',
			L"Y:", degreeY, L'\n',
			L"pressure: ",pressure));
	}
}
サンプルゲーム

筆圧に応じて水色のリングの大きさが変わります。
リングとリングの間に収まるちょうどいい状態を維持するとクリアです。

# include <Siv3D.hpp>

Circle CreateCircle()
{
	return{ Random(80.0, 560.0), 
			Random(80.0, 400.0), 
			Random(10.0, 80.0) };
}

void Main()
{
	const Sound sound(L"Example/Sound.mp3");

	const Font font(30);

	if (!Pentablet::SupportsPressure())
	{
		return;
	}

	Circle circle = CreateCircle();

	const int maxCount = 15;

	int count = 0;

	while (System::Update())
	{
		const Circle outerCircle = circle.stretched(20.0);

		const double pressure = Pentablet::Pressure()*100.0;

		const Circle pressureCircle(Mouse::Pos(), pressure);

		if (circle.r <= pressure && pressure <= outerCircle.r
			&& circle.within(pressureCircle)
			&& pressureCircle.within(outerCircle))
		{
			++count;
		}
		else
		{
			count = 0;
		}

		if (count == maxCount)
		{
			count = 0;

			sound.playMulti();

			circle = CreateCircle();
		}

		circle.drawFrame(1.0, 1.0);
		
		outerCircle.drawFrame(1.0, 1.0);
		
		pressureCircle.drawFrame(1.0, 1.0, Palette::Skyblue);

		pressureCircle.drawPie(0.0, TwoPi / maxCount*count, Palette::Skyblue);
	}
}