バッファを使う
複数のデーカーを一枚の画像として扱えるようにするには
もう一つのアプローチがある。
スナップショットデーカーの動作サンプルを見ればわかるが、
複数のデーカーを一枚の画像として扱えるようになってはいるものの、
画像は停止してしまっていた。
スナップショットなのだから当然と言えば当然である。
毎フレームスナップショットをとるようにして、
デーカーを動かしながら一枚の画像として扱えるようにできなくもないが
ちょっと非効率なかんじがする。
バッファデーカー
そんな時はバッファデーカーを使う。
バッファデーカーは子デーカーの表示を自身が持つバッファに写しこみ、
一枚の画像として扱えるようにするデーカーである。
子デーカーが動くとバッファの内容は自動的に適切に更新される。
バッファデーカーを作るにはCreateBuffer命令を使用する。
CreateBuffer(name="バッファ", w=1280, h=720);
組み込んでみよう。
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");
CreateBuffer(name="バッファ", w=1280, h=720);
CreateImage(name="バッファ/画像1", image="画像1.png");
CreateObject(name="バッファ/煙", x=1280/2, y=720/2+150, class=@煙クラス());
Enter(to="*");
Enter(to="バッファ/*");
wait 3000;
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");
}
単に対象をバッファデーカーの子デーカーにしているだけにしか見えないが
これだけでデーカーを動かしたまま一枚の画像として扱えるようになる。