2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Siv3D 小ネタ集(知られざる機能など)

Last updated at Posted at 2025-12-06

これは Siv3D Advent Calendar 2025 の投稿記事です。

本記事では、Siv3D 0.6.x(現時点では 0.6.16)の、まだ公式ドキュメント等であまり触れられていない機能や、便利機能、ハマったポイント(実体験)など雑多な小ネタをいくつか紹介します。

PixelShaderAsset

TextureAssetFontAsset 同様、PixelShader もアセットとして利用することができます。

Example/PixelShaderAsset.cpp
// アセット登録
PixelShaderAsset::Register(U"BgShader", HLSL{ U"shader/bg.hlsl", U"PS" });

//...

// 非同期ローディング
PixelShaderAsset::Load(U"BgShader");

//...

{
    // このスコープでテクスチャ描画にシェーダを適用する
    const ScopedCustomShader2D shader{ PixelShaderAsset(U"BgShader") };
    
    bgTexture.draw();
}

Siv3D でのアセット管理について:

フォントをアセットに登録し、かつフォールバックフォントを設定する

手順は次のとおりです。

  1. Font を作成してフォールバックフォントを設定
  2. FontAssetDatafont フィールドに上記 Font をセット
  3. FontAsset::Register でアセット登録
Example/FontAssetFallback.cpp
auto font1Data = std::make_unique<FontAssetData>();
font1Data->font = Font{ 12, U"Font1.ttf" };

// フォールバックフォントの設定
Font fontFallback{ 12, U"Font2.ttf" };
font1Data->font.addFallback(fontFallback);

// アセットに登録
FontAsset::Register(U"Font1", std::move(font1Data));

フォールバックフォントについて:

シーンの更新と描画を別々に行う

まずは基本的なシーンの更新方法。

Example/SceneUpdate1.cpp
	App manager;
	manager.add<Title>(U"Title");

	while (System::Update())
	{
		// シーンの更新と描画
		if (not manager.update())
		{
			break;
		}
	}

更新と描画は別々のタイミングで行うことができます。
これにより、例えば特定の条件において更新はするが描画はスキップする、など柔軟なシーン管理をすることができます。

Example/SceneUpdate1.cpp
	App manager;
	manager.add<Title>(U"Title");

	while (System::Update())
	{
		// シーンの更新
		if (not manager.updateScene())
		{
			break;
		}

        // シーンの描画
        app.drawScene();
	}

Siv3D でのシーン管理について:

lerp で色を変化させる

Siv3D では様々なクラスに lerp 関数が用意されています。A.lerp(B, x) とすると、A ~ B 間を割合 x(0.0~1.0)で線形補間した値が得られます。

色を表す Color (ColorF) にも用意されており、個人的に多用しています。

Example/ColorLerp.cpp
color.lerp(Palette::Black, 0.1) //ちょっと暗くする
color.lerp(Palette::White, 0.1) //ちょっと明るくする
color.lerp(Palette::Red, Periodic::Square0_1(100ms)) //赤く点滅
// などなど…

Audio をフェードありで停止したあと音量が0になっているの忘れがち

例えば、ある Audio を一時停止しようとして

Example/AudioPause1.cpp
// 再生を一時停止
audio1.pause(0.1s);

// ...

// 再生を再開・・・???
audio1.play();

としたとします。この場合、再生を再開しても、一時停止時にフェードアウトをしたことにより、audio1 の音量が 0 になっているため、(再生がされてはいるものの)何も聞こえません。

再開前に Audio::setVolume() で音量を設定するか、再開時にもフェード時間を指定する必要があります。

ここにしっかり「音量を 0 に変化させ、一時停止します」と書かれているので、見落としていた私の落ち度なのですが、「あれ、聞こえない???」となって少しハマってしまった実体験から、ここに記録させていただきます。

さいごに

ここでちゃんと解説されてるよ!・使い方間違ってんよ!・もっと良い方法があるよ! など、何かありましたらツッコミをお願いいたします。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?