雪を降らす

ややこしい機能の説明はこのくらいにして
ここからは具体的にいろんな演出を作りながらFoooの表現力を紹介していこう。
まだまだ説明していないことはたくさんあるのだけど…

細かい説明はとりあえず省略する!

手初めに雪を降らしてみよう。
まず雪粒の素材を用意する。

雪粒.png
SnowBall

この雪粒をスクリプトで降らせる。


method Main()
{
  CreateColor(name="背景", w=1280, h=720, color=black);
  Enter(to="背景");

  int $number = 0;
  while(true)
  {
    string $name = "雪粒"+String($number++);
    int $x = rand_range(0, 1280);
    percent $scale = Percent(0.2+frand()*0.8);

    CreateImage(name=$name
      , x=$x, y=-100, ox="Center", oy="Middle"
      , sx=$scale, sy=$scale, image="雪粒.png");
    Enter(to=$name);

    Move(to=$name, time=rand_range(5000,20000)
      , x=$x+rand_range(-200,200), y=720+100);

    wait 50;
  }
}
YouTube Preview Image

たったこれだけで雪を降らせることができた!
どういう内容のスクリプトだかわかるだろうか。
雪粒を一定時間毎に画面上にランダムに作成して画面下方向に移動させているだけだ。
while文は繰り返しを意味する文で、プログラマにはおなじみだろう。

なんだかごちゃごちゃ計算してるのは、雪粒を個々にランダムに動かすためだ。
frand、rand_rangeは乱数を返す関数である。
ただし動き自体はシンプルな直線移動である。
よく雪粒の動きというのは蛇行させなくちゃいけないと思われがちだが
雪粒の移動方向を微妙にずらすと単に直線的に移動させるだけでも、

目の錯覚で蛇行してるっぽくなる。

ここからは上級編。
実はさっきのスクリプトにはちょっとマズいところがある。
画面下に行った雪粒を消していないので、無限に雪粒が増え続けてしまうのだ。
画面下に行った雪粒を削除するようにしてみよう。
これにはスレッドを使うと簡単だ。


method 雪粒スレッド(string $name)
{
  int $x = rand_range(0, 1280);
  percent $scale = Percent(0.2+frand()*0.8);

  CreateImage(name=$name
    , x=$x, y=-100, ox="Center", oy="Middle"
    , sx=$scale, sy=$scale, image="雪粒.png");
  Enter(to=$name);

  Move(to=$name, time=rand_range(5000,20000)
    , x=$x+rand_range(-200,200), y=720+100);
  WaitDecor(to=$name);
  Delete(to=$name);
}

method Main()
{
  CreateColor(name="背景", w=1280, h=720, color=black);
  Enter(to="背景");

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

雪粒ごとにスレッドを作成して、
スレッドが1つの雪粒の作成から削除までを管理するようにしている。
お手軽だ。

さらにクラス化して、独自の部品にしてみよう。


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

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

  method 雪粒スレッド(string $name)
  {
    int $x = rand_range(0, 1280);
    percent $scale = Percent(0.2+frand()*0.8);

    CreateImage(name=$name
      , x=$x, y=-100, ox="Center", oy="Middle"
      , sx=$scale, sy=$scale, image="雪粒.png");
    Enter(to=$name);

    Move(to=$name, time=rand_range(5000,20000)
      , x=$x+rand_range(-200,200), y=720+100);
    WaitDecor(to=$name);
    Delete(to=$name);
  }
}

method Main()
{
  CreateColor(name="背景", w=1280, h=720, color=black);
  Enter(to="背景");

  CreateObject(name="雪", class=@雪クラス());
  Enter(to="雪");
}

スレッドはクラス内でも使用できる。
この場合のスレッドはオブジェクトデーカーの管理下で動作する。

単に独自のデーカー化しただけだが、このようにしておくと
雪エフェクトの細かな動作を雪クラスの中に隠蔽でき、
演出素材として使いまわしやすくなる。


Leave a Reply

*