【ウディタ講座】パーティクルでマップを彩る「雪のように降る光」

きれいなマップ素材を借りてきたけれど、有名どころだけに自分の色が出しにくく、イマイチ目立たない。

ウディタやツクールではよくある悩みですね。

自分で画像がいじれたらよいのですが、イラストやドット制作もかなりの高等技能。

お手軽かつ素材に頼らずマップを彩れるような視覚演出があればよいのですが、そんな都合の良いものがあるわけ……とおもいきや、あるのです。

その名もパーティクル。

パーティクルとは

Wikipediaによる説明

「パーティクル・システム」

パーティクル・システム(英: particle system)はコンピュータグラフィック技術のひとつで、運動する粒子により構成される事象を表現するために使われる。一般にパーティクル・システムを用いて模擬される事象の例としては、炎、爆発、煙、流水、火花、落葉、雲、霧、雪、埃、流星、毛髪、毛皮、草地、あるいは光跡や呪文の視覚効果などが挙げられる。

ウディタ的には<CIRCLE>

要するに、ただの円の画像でも無数に表示して動かしていけば色々な表現ができるわけです。

そしてウディタにはちょうどピクチャの隠し機能として <CIRCLE> のコマンドがありますね。

ウディタ説明書「ピクチャ」のページより)

元画像なしに図形を表示できてしまう機能なので、これでパーティクルができそうです。

 

パーティクル作例

パーティクル使用前

筆者には漠然と「RPGの終盤は最果ての雪国で、特にマップ表現に力が入っている」というイメージがあります。

ウディタデフォ素材で雪原にそびえる城を作ってみましょう。雰囲気を出したいので薄暗くしてみました。

 

パーティクル使用後

上記画像も、もうひと手間で「ここはボスの城」とか「世界ヤバい」なムードが出るかもしれません。

まっとうにやるとマップチップの工夫で緻密に豪華にマップを組み立てるところですが、パーティクルコモンを置いてみるとどうでしょうか。

赤い雪が深々と降る印象的な絵面になりました。

実際にはもっとなめらかにアニメーション(?)しています。マップが凝っていればさらに訴求力ある情景になるのではないでしょうか。

ウディタでパーティクルコモンを作る方法

というわけで、今回は「雪のように光の粒子が降り続けるパーティクル」コモンです。

事前に「空き番号さがしコモン」を用意

パーティクルは大量のピクチャを使いますので、逐一番号を振っていては大変です。

「0~500番の範囲で、順次あいている番号を探して使う」といった方法をとるのに便利なコモンの用意からはじめましょう。

■変数操作: CSelf4[結果] = CSelf0[範囲始点] + 0
■ループ開始
|■条件分岐(変数): 【1】 CSelf4[結果] が CSelf1[範囲終点] と同じ
|-◇分岐: 【1】 [ CSelf4[結果] が CSelf1[範囲終点] と同じ ]の場合↓
| |▼ 終点にきたらチェック終了
| |■ループ中断
| |■
|◇分岐終了◇
|■変数操作+: CSelf10[使われてる?_yes1] = ピクチャ:CSelf4[結果] の ピクチャが使用中?(1=YES)
|■条件分岐(変数): 【1】 CSelf10[使われてる?_yes1] が 0 と同じ
|-◇分岐: 【1】 [ CSelf10[使われてる?_yes1] が 0 と同じ ]の場合↓
| |▼ このとき、この番号のピクチャが使われていない(空き番号)
| |■ループ中断
| |■
|◇分岐終了◇
|■変数操作: CSelf4[結果] += 1 + 0
|■
◇ループここまで◇◇

要するに、ループで番号をひとつずつ辿って、「この番号のピクチャは使用中?」を確認し続けるという処理です。

パーティクルコモン本体

空き番号チェックコモンができたら、ほとんど終わったようなものです。

次のような並列処理コモンを動かせば、それっぽいパーティクルが動き出してくれるでしょう。

▼ ループ回数や終わりのウェイトの数値で発生量を調整可能
■回数付きループ [ 5 ]回
|■イベントの挿入[名]: CSelf11[ピクチャ番号] = [“指定範囲から空き番号をさがす”] <コモンEv 1> / 0 / 500
|▼
|▼ ↓最初に表示する座標や、移動量のプラスマイナスの調整で、「下から湧き起こる光球」などにも応用可
|■変数操作: CSelf33[描画X] = 0 ~ 320
|■変数操作: CSelf34[描画Y] = 0 ~ 50
|■変数操作: CSelf30[移動量X] = -40 ~ 40
|■変数操作: CSelf31[移動量Y] = 100 ~ 200
|■変数操作: CSelf12[拡大率] = 5 ~ 60
|▼
|■変数操作: CSelf16[描画速度] = 50 ~ 60
|■変数操作: CSelf15[移動速度] = CSelf16[描画速度] * 3
|■変数操作: CSelf15[移動速度] = CSelf15[移動速度] ~ 500
|■変数操作: CSelf18[透明度] = 200 ~ 250
|■変数操作: CSelf20[消去速度] = 8 ~ CSelf16[描画速度] |▼
|▼ 描画の前に、念のため今から使う番号への各種演出命令を停止
|■ピクチャ[ディレイ内容リセット]:CSelf11[ピクチャ番号] |■ピクチャ消去:CSelf11[ピクチャ番号] / 0(0)フレーム
|■ピクチャエフェクト:CSelf11[ピクチャ番号] [自動拡大縮小] 横8%/縦8%/ 休10フレーム 拡縮時間(0)フレーム
|■ピクチャエフェクト:CSelf11[ピクチャ番号] [描画座標シフト] Xシフト 0 / Yシフト 0 (0)フレーム
|▼
|▼ 描画&各種エフェクト&消去演出
|■ピクチャ表示:CSelf11[ピクチャ番号] [中心]ウィンドウ「<CIRCLE>」サイズ[10,10] X:CSelf33[描画X] Y:CSelf34[描画Y] / CSelf16[描画速度](0)フレーム / パターン 1 / 透 CSelf18[透明度] / 加算 / 角 0 / 拡 CSelf12[拡大率]% / カラー R[50] G[0] B[0] |■ピクチャエフェクト:CSelf11[ピクチャ番号] [自動拡大縮小] 横5%/縦5%/ 休10フレーム 拡縮時間(15)フレーム
|■ピクチャエフェクト:CSelf11[ピクチャ番号] [描画座標シフト] Xシフト CSelf30[移動量X] / Yシフト CSelf31[移動量Y] (CSelf15[移動速度])フレーム
|■変数操作: CSelf20[消去速度] += CSelf16[描画速度] / 2
|■ピクチャ消去:CSelf11[ピクチャ番号] / 30(CSelf20[消去速度])フレーム
|■
◇ループここまで◇◇
■ウェイト:4 フレーム

 

理屈としてはつぎのことを繰り返しているだけですね。

  • <CIRCLE>コマンドで円形画像を呼び出し続ける
  • 呼び出す際の座標や拡大率、不透明度などは乱数で決定
  • 呼び出した後は、乱数で決めた移動量を指定