スナップショットをとる

ここまでに紹介したTransit, UniversalTransit, Transformは
デーカーの見た目を変化させる命令であり、描画命令と呼ぶ。
描画命令は画像を表示する機能を持つデーカーに共通して使用できる。
イメージデーカー、テキストデーカー、バルーンデーカーなどだ。

しかしこれらの命令の効果は、その命令を受けたデーカーの見た目だけに限定される。
つまりこれらの命令を使って”複数のデーカーを合体させたもの”を
まとめてトランジッションしたりまとめて変形させるといったようなことはできない。

だがそのようなことがまったく不可能なわけではない。
別の機能と組み合わせることで実現できる。

Decor_Snapshot スナップショットデーカー

スナップショットデーカーはイメージデーカーの特殊版とも言えるデーカーで
他のデーカーの表示を取り込んで自身の画像とする機能を持つデーカーである。
このデーカーを使えば、”複数のデーカーを合体させた画像”を作ることができる。
そしてそのスナップショットデーカーに対してトランジッションを行えば、
“複数のデーカーを合体させたもの”をトランジッションさせるようなことができる。

スナップショットデーカーを作るにはCreateSnapshot命令を使う。


CreateSnapshot(name="スナップ");

そしてスナップショットを取りたい位置でRequest命令で@Snapshot()を指示する。


Request(to="スナップ", order=@Snapshot(target="画像1", w=1280, h=720));

target パラメータにはスナップショットをとりたい対象のデーカー名を指定する。
省略すると画面全体が対象となる。
w パラメータはスナップショット画像の横幅を指定する。
h パラメータはスナップショット画像の縦幅を指定する。
実際に組み込んでみよう。


class 煙クラス
{
  method 煙クラス()
  {
  }

  method OnEnter()
  {
    int $number = 0;
    while(true)
    {
      string $name = "煙粒"+String($number++);
      ThreadCreate(call=@煙粒スレッド(name=$name));
      wait 100;
    }
  }

  method 煙粒スレッド(string $name)
  {
    CreateImage(name=$name
      , x=0, y=0, sx=20%, sy=20%, ox="Center", oy="Middle"
      , angle=rand_range(0,359), image="煙粒.png");
    Enter(to=$name);

    int $time = 2000;
    int $angle = 90+rand_range(-10,10);
    float $rad = radian(Float($angle));
    float $move = 300.0;
    float $x = $move*cos($rad);
    float $y = -$move*sin($rad);

    Move(to=$name, time=$time, x=$x, y=$y, step="DecSin");
    Zoom(to=$name, time=$time, sx=200%, sy=200%);
    Opaque(to=$name, time=$time, alpha=0%, step="AccSin");
    WaitDecor(to=$name);
    Delete(to=$name);
  }
}

method Test(string $effect)
{
  Transform(to="スナップ", effect=$effect, time=1000);
  wait 1000;
  Transform(to="スナップ", effect=$effect, time=1000, begin=100%, end=0%);
  wait 1000;
}

method Main()
{
  CreateImage(name="画像2", image="画像2.png");
  CreateImage(name="画像1", image="画像1.png");
  CreateObject(name="画像1/煙", x=1280/2, y=720/2+150, class=@煙クラス());
  CreateSnapshot(name="スナップ");
  Enter(to="*");
  Enter(to="画像1/*");
  wait 3000;

  Request(to="スナップ", order=@Snapshot(target="画像1", w=1280, h=720));
  Exit(to="画像1");

  call @Test(effect="LinearLeft");
  call @Test(effect="BlindLeft");
  call @Test(effect="CurtainLeft");
  call @Test(effect="ShaveLeft");
  call @Test(effect="SlashH");
  call @Test(effect="BoxCenter");
  call @Test(effect="HoleCenter");
  call @Test(effect="FanCenter");
  call @Test(effect="TensileLeft");
  call @Test(effect="Mosaic");
}
YouTube Preview Image

ずいぶん長いが重要なところは黄色で示されている部分だけだ。
Exit命令はEnter命令とは逆にデーカーを消す命令である。
スナップショットをとったら元の画像は必要ないのですぐ消すようにしている。

実行結果を見ると確かにスナップショットをとって
それを一つのイメージデーカーのように扱えているのがわかるだろう。
スナップショットデーカーは場面転換の演出を作る際などにうってつけである。


Leave a Reply

*