トランジション (Transition)

概要

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

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

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

トランジション

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

シーンが変更されるまでは次のシーンは描画できず、変更した後は前のシーンは更新が停止してしまうので、最終フレームが描画されます。

主なメソッド

名称 説明
ChangeScene シーンを次のシーンに変更します。トランジションの機能を自分で開発する人向けです。
Finish トランジションを終了します。トランジションの機能を自分で開発する人向けです。
DrawTriangleWithNextScene 次のシーンを画像として三角形に貼り付けて描画します。トランジションの機能を自分で開発する人向けです。
DrawTriangleWithPreviousScene( 前のシーンを画像として三角形に貼り付けて描画します。トランジションの機能を自分で開発する人向けです。

主なプロパティ

主なイベント

名称 説明
OnUpdate 毎フレーム実行される更新イベント

使用方法

トランジションの例としてTransitionFadeクラスのサンプルを提示します。


  /// <summary>
  /// Transitionを用いて、シーンの変更の見栄えを変更するサンプルです。
  /// </summary>
  public class Transition
  {
      /// <summary>
      /// Scene1の画像を表示するシーン
      /// </summary>
      class Scene1 : ace.Scene
      {
          public Scene1()
          {
              // レイヤーを追加する。
              var layer = new ace.Layer2D();
              AddLayer(layer);
  
              // Scene1を描画するインスタンスを生成してレイヤーに追加する。
              var obj = new ace.TextureObject2D();
              obj.Texture = ace.Engine.Graphics.CreateTexture2D("Data/Texture/Scene1.png");
  
              layer.AddObject(obj);
          }
  
          protected override void OnUpdated()
          {
              // マウスが左クリックされた時にフェード付きでScene2に遷移する。
              if (ace.Engine.Mouse.LeftButton.ButtonState == ace.MouseButtonState.Push)
              {
                  var scene2 = new Scene2();
                  ace.Engine.ChangeSceneWithTransition(scene2, new ace.TransitionFade(1.0f, 1.0f));
              }
          }
      }
  
      /// <summary>
      /// Scene2の画像を表示するシーン
      /// </summary>
      class Scene2 : ace.Scene
      {
          public Scene2()
          {
              // レイヤーを追加する。
              var layer = new ace.Layer2D();
              AddLayer(layer);
  
              // Scene2を描画するインスタンスを生成してレイヤーに追加する。
              var obj = new ace.TextureObject2D();
              obj.Texture = ace.Engine.Graphics.CreateTexture2D("Data/Texture/Scene2.png");
  
              layer.AddObject(obj);
          }
  
          protected override void OnUpdated()
          {
              // マウスが左クリックされた時にScene1へ遷移する。
              if (ace.Engine.Mouse.LeftButton.ButtonState == ace.MouseButtonState.Push)
              {
                  var scene1 = new Scene1();
                  ace.Engine.ChangeScene(scene1);
              }
          }
      }
  
      [System.STAThread]
      static void Main(string[] args)
      {
          // AC-Engineを初期化する。
          ace.Engine.Initialize("Transition", 640, 480, new ace.EngineOption());
  
          // シーンをScene1に変更する。
          var scene = new Scene1();
          ace.Engine.ChangeScene(scene);
  
          // AC-Engineのウインドウが閉じられていないか確認する。
          while (ace.Engine.DoEvents())
          {
              // AC-Engineを更新する。
              ace.Engine.Update();
          }
  
          // AC-Engineの終了処理をする。
          ace.Engine.Terminate();
      }
  }