トランジション (Transition)

概要

トランジションはシーンを変更する際に、画面が瞬間的に切り替わるのではなく何かしらの画面効果を加えてシーンを変更する機能です。例えば、フェードイン・フェードアウトといった画面効果を与えます。トランジションはシーンを変更する際にEngine.Change.ChangeSceneWithTransitionの引数にトランジションのインスタンスを与えることで使用できます。

注意する点としてトランジションを設定した場合は即座にシーン変更が行われない点があります。例えばフェードの場合、フェードアウトが終わるまでは前のシーンの更新が実行され、フェードインが開始されてから次のシーンの更新が実行されます。既にトランジションが実行されている最中に、更にシーンを変更しようとすると予期せぬ挙動が発生する可能性があります。

トランジションにはメソッドが存在しますが、基本的にそれらのメソッドはトランジションの機能を自分で開発したい人向けであり通常のユーザーはシーンを変更するときにトランジションを継承したクラスのインスタンスを渡すだけでトランジションの機能を使用できます。

トランジション

トランジションは既に用意されているトランジションの他に自分でトランジションを開発できます。Transitionクラスを継承し動作を定義することで新たなトランジションを実現できます。OnUpdateを継承し、毎フレームの更新の内容を記述します。ここでは、主にトランジションの描画内容の指定、シーンが変更されるタイミング、及びトランジションが終了するタイミングを指定します。DrawTriangleWithPreviousSceneDrawRectangleWithNextSceneでシーンを画像として描画し、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;
  }