Open4

OpenSiv3D v0.6.5 新規追加・更新サンプル

Ryo SuzukiRyo Suzuki

LineString::extractLineString(double, CloseRing)

# include <Siv3D.hpp> // OpenSiv3D v0.6.5

void Main()
{
	Scene::SetBackground(ColorF{ 1.0 });

	LineString ls, curve;

	while (System::Update())
	{
		if (MouseL.down())
		{
			ls << Cursor::Pos();

			curve = ls
				.reversed() // 向きを反転
				.catmullRom() // Carmull-Rom スプライン曲線
				.extractLineString(20); // 始点からの道のり 20 の位置から終点までの部分 LineString
		}

		if (curve)
		{
			curve.draw(2, ColorF{ 0.1 });

			// (底辺の中心座標, 頂点, 底辺の長さ)から二等辺三角形を作成
			Triangle::FromPoints(curve.front(), ls.back(), 30).draw(ColorF{ 0.1 });
		}
	}
}
Ryo SuzukiRyo Suzuki

JSON の BSON / CBOR / MessagePack 変換

# include <Siv3D.hpp> // OpenSiv3D v0.6.5

void Main()
{
	// JSON ファイルからデータを読み込む
	const JSON json = JSON::Load(U"example/json/config.json");

	const Blob bson = json.toBSON();
	const Blob cbor = json.toCBOR();
	const Blob msgpack = json.toMessagePack();

	Print << bson.size();
	Print << cbor.size();
	Print << msgpack.size();

	Print << (json == json);
	Print << (json == JSON::FromBSON(bson));
	Print << (json == JSON::FromCBOR(cbor));
	Print << (json == JSON::FromMessagePack(msgpack));

	while (System::Update())
	{

	}
}
Ryo SuzukiRyo Suzuki

ファイルパスを結合する FileSystem::PathAppend()

# include <Siv3D.hpp> // OpenSiv3D v0.6.5

void Test(FilePathView a, FilePathView b)
{
	if (a == b)
	{
		Console << U"[OK]";
	}
	else
	{
		Console << U"[Failed]: " << a << U" vs " << b;
	}
}

void Main()
{
	Test(FileSystem::PathAppend(U"example", U"windmill.png"), U"example/windmill.png");
	Test(FileSystem::PathAppend(U"example/", U"windmill.png"), U"example/windmill.png");
	Test(FileSystem::PathAppend(U"./example", U"windmill.png"), U"./example/windmill.png");
	Test(FileSystem::PathAppend(U"./App/", U"example/windmill.png"), U"./App/example/windmill.png");
	Test(FileSystem::PathAppend(U"./", U"windmill.png"), U"./windmill.png");

	Test(FileSystem::PathAppend(U"example", U""), U"example/");
	Test(FileSystem::PathAppend(U"example/", U""), U"example/");
	Test(FileSystem::PathAppend(U"./example", U""), U"./example/");
	Test(FileSystem::PathAppend(U"./example/", U""), U"./example/");

	Test(FileSystem::PathAppend(U"", U"windmill.png"), U"windmill.png");
	Test(FileSystem::PathAppend(U"", U"example"), U"example");
	Test(FileSystem::PathAppend(U"", U"example/"), U"example/");
	Test(FileSystem::PathAppend(U"", U"./example/"), U"./example/");

	Test(FileSystem::PathAppend(U"", U""), U"");

# if SIV3D_PLATFORM(WINDOWS)
	Test(FileSystem::PathAppend(U"C:foo", U"bar"), U"C:foo/bar");
	Test(FileSystem::PathAppend(U"C:/foo/", U"bar"), U"C:/foo/bar");
# endif

	while (System::Update())
	{

	}
}
Ryo SuzukiRyo Suzuki

TextEditState に、Tab キーや Enter キーによる入力完了を取得できるメンバ変数を追加

# include <Siv3D.hpp> // OpenSiv3D v0.6.5

void Main()
{
	Scene::SetBackground(ColorF{ 0.8, 0.9, 1.0 });

	TextEditState te0, te1;

	bool avtivateNextTextBox = false;

	while (System::Update())
	{
		// Tab キーの押下と同じフレームで次のテキストボックスをアクティブ化してしまうと
		// その Tab キーの押下でそのテキストボックスも非アクティブ化してしまうため、1 フレーム後にアクティブ化
		if (avtivateNextTextBox)
		{
			// テキストボックスをアクティブ化
			te1.active = true;

			avtivateNextTextBox = false;
		}

		const bool previous = te0.active;

		SimpleGUI::TextBox(te0, Vec2{ 100, 100 }, 200);

		// 非アクティブ化された
		if (previous && (te0.active == false))
		{
			// Tab キーが入力されていた場合、次のテキストボックスをアクティブ化するフラグを true に
			avtivateNextTextBox = te0.tabKey;
		}

		SimpleGUI::TextBox(te1, Vec2{ 100, 140 }, 200);
	}
}