トランジションはシーンを変更する際に、画面が瞬間的に切り替わるのではなく何かしらの画面効果を加えてシーンを変更する機能です。例えば、フェードイン・フェードアウトといった画面効果を与えます。トランジションはシーンを変更する際にEngine.Change.ChangeSceneWithTransition
の引数にトランジションのインスタンスを与えることで使用できます。
注意する点としてトランジションを設定した場合は即座にシーン変更が行われない点があります。例えばフェードの場合、フェードアウトが終わるまでは前のシーンの更新が実行され、フェードインが開始されてから次のシーンの更新が実行されます。既にトランジションが実行されている最中に、更にシーンを変更しようとすると予期せぬ挙動が発生する可能性があります。
トランジションにはメソッドが存在しますが、基本的にそれらのメソッドはトランジションの機能を自分で開発したい人向けであり通常のユーザーはシーンを変更するときにトランジションを継承したクラスのインスタンスを渡すだけでトランジションの機能を使用できます。
トランジションは既に用意されているトランジションの他に自分でトランジションを開発できます。Transition
クラスを継承し動作を定義することで新たなトランジションを実現できます。OnUpdate
を継承し、毎フレームの更新の内容を記述します。ここでは、主にトランジションの描画内容の指定、シーンが変更されるタイミング、及びトランジションが終了するタイミングを指定します。DrawTriangleWithPreviousScene
とDrawRectangleWithNextScene
でシーンを画像として描画し、ChangeScene
で前のシーンから次のシーンへ変更、Finish
でトランジションを終了します。
シーンが変更されるまでは次のシーンは描画できず、変更した後は前のシーンは更新が停止してしまうので、最終フレームが描画されます。
名称 | 説明 |
---|---|
ChangeScene | シーンを次のシーンに変更します。トランジションの機能を自分で開発する人向けです。 |
Finish | トランジションを終了します。トランジションの機能を自分で開発する人向けです。 |
DrawTriangleWithNextScene | 次のシーンを画像として三角形に貼り付けて描画します。トランジションの機能を自分で開発する人向けです。 |
DrawTriangleWithPreviousScene( | 前のシーンを画像として三角形に貼り付けて描画します。トランジションの機能を自分で開発する人向けです。 |
名称 | 説明 |
---|---|
OnUpdate | 毎フレーム実行される更新イベント |
トランジションの例としてTransitionFadeクラスのサンプルを提示します。
#include <ace.h>
// Transitionを用いて、シーンの変更の見栄えを変更するサンプルです。
// Scene1の画像を表示するシーン
class Scene1 : public ace::Scene
{
protected:
virtual void OnUpdated() override;
public:
Scene1();
};
// Scene2の画像を表示するシーン
class Scene2 : public ace::Scene
{
protected:
virtual void OnUpdated() override;
public:
Scene2();
};
Scene1::Scene1()
{
// レイヤーを追加する。
auto layer = std::make_shared<ace::Layer2D>();
AddLayer(layer);
// Scene1を描画するインスタンスを生成してレイヤーに追加する。
auto obj = std::make_shared<ace::TextureObject2D>();
obj->SetTexture(ace::Engine::GetGraphics()->CreateTexture2D(ace::ToAString("Data/Texture/Scene1.png").c_str()));
layer->AddObject(obj);
}
void Scene1::OnUpdated()
{
// マウスが左クリックされた時にフェード付きでScene2に遷移する。
if (ace::Engine::GetMouse()->GetLeftButton()->GetButtonState() == ace::MouseButtonState::Push)
{
auto scene2 = std::make_shared<Scene2>();
ace::Engine::ChangeSceneWithTransition(scene2, std::make_shared<ace::TransitionFade>(1.0f, 1.0f));
}
}
Scene2::Scene2()
{
// レイヤーを追加する。
auto layer = std::make_shared<ace::Layer2D>();
AddLayer(layer);
// Scene2を描画するインスタンスを生成してレイヤーに追加する。
auto obj = std::make_shared<ace::TextureObject2D>();
obj->SetTexture(ace::Engine::GetGraphics()->CreateTexture2D(ace::ToAString("Data/Texture/Scene2.png").c_str()));
layer->AddObject(obj);
}
void Scene2::OnUpdated()
{
// マウスが左クリックされた時にScene1に遷移する。
if (ace::Engine::GetMouse()->GetLeftButton()->GetButtonState() == ace::MouseButtonState::Push)
{
auto& scene1 = std::make_shared<Scene1>();
ace::Engine::ChangeScene(scene1);
}
}
int main()
{
//AC-Engineを初期化する。
ace::Engine::Initialize(ace::ToAString("Transition").c_str(), 640, 480, ace::EngineOption());
// シーンをScene1に変更する。
auto scene = std::make_shared<Scene1>();
ace::Engine::ChangeScene(scene);
// AC-Engineのウインドウが閉じられていないか確認する。
while (ace::Engine::DoEvents())
{
// AC-Engineを更新する。
ace::Engine::Update();
}
//AC-Engineの終了処理をする。
ace::Engine::Terminate();
return 0;
}