グローバル変数として作成できないクラス¶
説明¶
Siv3D プログラミングにおいて、グローバル変数の使用は不必要なので避けるべきです。
また、Siv3D にはグローバル変数として作成できないクラスがあります。以下のクラスや、以下のクラスをメンバ変数に含むクラスをグローバル変数にすると、エンジンの初期化前にエンジン機能にアクセスしようとして実行時エラーが発生します。
Texture
DynamicTexture
RenderTexture
MSRenderTexture
Font
Audio
Effect
Mesh
Model
VertexShader
PixelShader
Script
代わりの方法 (1)¶
Main 関数内でインスタンス化するクラスのメンバ変数としたり、関数の引数として渡したりすることで、グローバル変数を使用することなく、プログラムの様々な場所で上記のクラスを利用できます。
# include <Siv3D.hpp>
class Game
{
public:
void draw() const
{
m_cat.drawAt(100, 100);
m_dog.drawAt(300, 300);
}
private:
Texture m_cat = Texture{ U"🐈"_emoji };
Texture m_dog = Texture{ U"🐕"_emoji };
};
struct Faces
{
Array<Texture> textures;
Faces()
{
textures << Texture{ U"😊"_emoji };
textures << Texture{ U"🤔"_emoji };
textures << Texture{ U"🤣"_emoji };
}
};
void DrawFace(const Faces& faces)
{
const int32 index = (Time::GetSec() % 3);
faces.textures[index].drawAt(200, 200);
}
void Main()
{
Game game; // ここで Texture が作成される
Faces faces; // ここで Texture が作成される
while (System::Update())
{
game.draw();
DrawFace(faces);
}
}
代わりの方法 (2)¶
Texture
, Audio
, Font
, VertexShader
, PixelShader
に関しては、アセット管理機能を使うことで、プログラムの様々な場所で特定のアセットにアクセスすることができます。
# include <Siv3D.hpp>
void Draw()
{
// アセット管理機能を通してテクスチャアセットを使用する
TextureAsset(U"Windmill").draw();
TextureAsset(U"Siv3D-kun").scaled(0.8).drawAt(200, 200);
}
void Main()
{
// アセット管理機能にテクスチャアセットを登録する
TextureAsset::Register(U"Windmill", U"example/windmill.png", TextureDesc::Mipped);
TextureAsset::Register(U"Siv3D-kun", U"example/siv3d-kun.png", TextureDesc::Mipped);
while (System::Update())
{
Draw();
}
}