メソッド化する

演出にはフェードインのように非常によく使うものがある。
そのような処理を何度も何度も書くのは面倒であるばかりか
スクリプトを著しく読みにくくし、後からの修正もしにくくする。

メソッドの定義

そのような時はよく使う処理を『メソッド』という形で予め定義しておき、
必要な箇所でそれを使いまわすようする。
メソッドとは方法、手法という意味だが、プログラミングにおいては
ある特定の処理手続きを指すようなニアンスで使われる。
それでは例としてフェードインをするメソッドを定義してみよう。


method フェードイン()
{
  CreateColor(name="幕", color=white, w=1280, h=720, blend="Add");
  Enter(to="幕");
  wait 500;
  Opaque(to="幕", time=1000, alpha=0%, step="DecSin");
}

──────何だか見覚えがあるだろう。
そう今まで散々書いてきた method Main(){ ~ } にとても良く似ている。
それもそのはず method Main(){ ~ } は”Main”という名のメソッドの定義なのだ。
Mainメソッド はFoooエンジンが必ず最初に実行するメソッドである。
上の例は”Main”とは別に”フェードイン”という名前のメソッドを定義している。

メソッドの呼び出し

定義したメソッドを利用するにはcall文を使う。
call文の書き方は若干特殊だ。


  call @フェードイン();

callという名が示す通り、メソッドを利用することを一般的に「メソッドを呼び出す」と言う。
メソッドを呼び出すと、処理はいったん呼び出し先のメソッドに移り、
そのメソッド命令を最後まで実行し終えると呼び出し元に戻る。

メソッドのパラメータ定義

よく使う演出とは言っても、演出が完全に決まり決まっていることは少ない。
フェードインであっても白からのフェードイン、黒からのフェードインなど
多数のバリエーションが考えられる。
そのようなケース毎にメソッドを作っていたら、途端にメソッドの数は膨大なものになってしまう。

メソッドにパラメータを定義すればこの問題に対処できる。
詳しい説明をすると長くなるので省くが、次のようにするとフェードインメソッドが
色と、合成モードと、所要時間をパラメータにとることができるようになる。


method フェードイン(color $色=white, string $合成="Normal", int $時間=1000)
{
  CreateColor(name="幕", color=$色, w=1280, h=720, blend=$合成);
  Enter(to="幕");
  wait 500;
  Opaque(to="幕", time=$時間, alpha=0%, step="DecSin");
}

呼び出しは次のようになる。


  call @フェードイン(色=white, 合成="Add");

ちょっとこのあたりはプログラミングの知識がないと理解が難しいかもしれない…
でも使い方を見れば、どういう意味なのかなんとなく想像がつくだろう。たぶん。
それでは組み込んでみよう。


style 普通 { face="MS ゴシック", size=32 }
style 小 { size=24 }
style つぶやき { interval=100, speed=250, effect="Rise" }

#base_param CreateBalloon(style="普通")
#base_param CreateFrame(outline_shape="Vivide"
  , outline_color=white, outline_thick=8)

method フェードイン(color $色=white, string $合成="Normal", int $時間=1000)
{
  CreateColor(name="幕", color=$色, w=1280, h=720, blend=$合成);
  Enter(to="幕");
  wait 500;
  Opaque(to="幕", time=$時間, alpha=0%, step="DecSin");
}

method Main()
{
  CreateImage(name="背景", image="背景.png"
    , x=0, y=0);

  CreateNode(name="コマ1"
    , x=642, y=0, sx=0%);
  CreateWindow(name="コマ1/窓"
    , w=405, h=720, ox="Center", propagation="CancelParentZoom");
  CreateImage(name="コマ1/窓/画像", image="コマ1.png"
    , x=20, y=324, ox="Center", oy="Middle", sx=110%, sy=110%
    , sampling="BieLinear");
  CreateOutline(name="コマ1/枠"
    , w=405, h=720, shape="Fade", color=RGBA(0,0,0,64), thick=8
    , ox="Center", adaptive=true);

  CreateFrame(name="コマ2", image="コマ2.png"
    , x="OutRight", y=65);
  CreateFrame(name="コマ3", image="コマ3.png"
    , x=407, y=505, ox="Center", oy="Middle", sx=0%, sy=0%
    , outline_color=black);

  CreateBalloon(name="台詞1"
    , text="それにしても...<BR>腹(はら)が減(へ)った"
    , x=585, y=65, shape="Dumpling", w=300, h=185, tail=-30);
  CreateBalloon(name="コマ3/台詞2"
    , style="小", text="<FONT style='つぶやき'>クククク…"
    , x=63, y=15, shape="Rock", w=220, h=125, tail=160);

  Enter(to="背景");
  Enter(to="コマ1");
  Enter(to="コマ1/窓");
  Enter(to="コマ1/窓/画像");
  Enter(to="コマ1/枠");

  call @フェードイン(色=white, 合成="Add");

  Zoom(to="コマ1", time=1000, sx=100%, step="DecSin");
  Move(to="コマ1/窓/画像", time=1000, x=-20, step="DecSin");
  WaitDecor();

  Enter(to="コマ2");
  Move(to="コマ2", time=800, x=780, step="Dec3");
  WaitDecor();

  Enter(to="台詞1", effect="Bound");
  WaitDecor();

  Enter(to="コマ3");
  Zoom(to="コマ3", time=1000, sx=100%, sy=100%, step="AccSig");
  wait 600;

  Enter(to="コマ3/台詞2", effect="Expand");
  WaitDecor();
}

フェードインをメソッド化したことでスクリプトが少し簡潔になり
何をしているのかよりわかりやすくなった。


Leave a Reply

*