シーン切り替え(シルエット) - Siv3D/Reference-JP GitHub Wiki

シルエットを使ったシーン切り替え
# include <Siv3D.hpp>
# include <HamFramework.hpp>

using MyApp = SceneManager<String>;

void Fade(double t, bool in)
{
    if (t > 0.75)
    {
        Window::ClientRect().draw(ColorF(0.0));
        return;
    }

    t *= (1 / 0.75);

    Graphics2D::SetStencilState(StencilState::Replace);
    Graphics2D::SetStencilValue(1);

    TextureAsset(L"siv3d-kun")
        .scale(4 * EaseIn(Easing::Quad, 1 - t))
        .rotate((in ? (1.0 - t) : t) * 10)
        .drawAt(Window::Center());

    Graphics2D::SetStencilState(StencilState::Test(StencilFunc::NotEqual));
    Window::ClientRect().draw(ColorF(0.0, t * 4.0));
    Graphics2D::SetStencilState(StencilState::Default);
}

void FadeIn(double t)
{
    Fade(1.0 - t, true);
}

void FadeOut(double t)
{
    Fade(t, false);
}

struct Title : MyApp::Scene
{
    void init() override
    {
        Graphics::SetBackground(Palette::Seagreen);
    }

    void update() override
    {
        if (Input::MouseL.clicked)
            changeScene(L"Game1", 3500);
    }

    void draw() const override {}

    void drawFadeOut(double t) const override
    {
        FadeOut(t);
    }
};

struct Game1 : MyApp::Scene
{
    void init() override
    {
        Graphics::SetBackground(Palette::Skyblue);
    }

    void update() override
    {
        if (Input::MouseL.clicked)
            changeScene(L"Game2", 3500);
    }

    void draw() const override
    {
        for (auto p : step({ 8, 6 }))
        {
            Circle(p * 80 + Point(40, 40), 20).draw(HSV(0, 1.0 - p.y / 5.0, 1.0));
        }
    }

    void drawFadeIn(double t) const override
    {
        draw();
        FadeIn(t);
    }

    void drawFadeOut(double t) const override
    {
        draw();
        FadeOut(t);
    }
};

struct Game2 : MyApp::Scene
{
    void init() override
    {
        Graphics::SetBackground(Palette::Orange);
    }

    void update() override
    {
        if (Input::MouseL.clicked)
            changeScene(L"Game1", 3500);
    }

    void draw() const override
    {
        for (auto p : step({ 8, 6 }))
        {
            Rect(40).setCenter(p * 80 + Point(40, 40)).draw(HSV(180, 1.0 - p.y / 5.0, 1.0));
        }
    }

    void drawFadeIn(double t) const override
    {
        draw();
        FadeIn(t);
    }

    void drawFadeOut(double t) const override
    {
        draw();
        FadeOut(t);
    }
};

void Main()
{
    TextureAsset::Register(L"siv3d-kun", L"Example/siv3d-kun.png");

    MyApp manager;
    manager.add<Title>(L"Title");
    manager.add<Game1>(L"Game1");
    manager.add<Game2>(L"Game2");

    while (System::Update())
    {
        if (!manager.updateAndDraw())
            break;
    }
}
⚠️ **GitHub.com Fallback** ⚠️