マスクを動かす
Posted 2013.03.03 in 流動指向ゲームエンジン『Fooo』
マスクデーカーはマスク画像を使って表示制限を行うが、
「画像」とは「画像ファイル」じゃなくてもいいんじゃないか?
と、勘のいい人なら気づくかもしれない。
そう、マスクデーカーにはマスクとして「画像ファイル」ではなく、
「画像として扱えるデーカー」を指定することもできる。
やり方はGetDecor関数でデーカーへの参照を取得しmaskパラメータに渡すだけだ。
CreateMask(name="マスク", mask=GetDecor("画像を持つデーカー"));
これでいったい何ができるのかというと、
マスクにバッファデーカーを指定することでマスク画像を動かすことが可能になる。
試してみよう。
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()
{
CreateBuffer(name="バッファ", w=1280, h=720, x=10000);
CreateImage(name="バッファ/星", image="マスク.png"
, x="Center", y="Middle", ox="Center", oy="Middle");
Enter(to="バッファ");
Enter(to="バッファ/星");
Rotate(to="バッファ/星", time=30000, angle=360);
Zoom(to="バッファ/星", time=30000, sx=400%, sy=400%);
CreateImage(name="画像2", image="画像2.png");
CreateMask(name="マスク", mask=GetDecor("バッファ"), mask_mode="Blue");
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");
}
mask_modeというパラメータは画像の何の情報を不透明度として扱うかという指定である。
デフォルトでは自動で判断されるのだが、今回は都合が悪いので直接指定している。
“Blue”は青色要素を不透明度とする指定だ。
ちなみに似たようなことがUniversalTransit命令などでも可能である。