2014年12月20日

DXRubyAdventCalender20日目

この記事はDXRuby Advent Calendar 2014の20日目です。
19日の記事はカイリカさんの『DXRubyWS 入門』でした。
WSの導入から実際に使用するまでの流れがわかりやすく書いてあり参考になりました。
WSは現在mirichiさんにより開発中のDXRuby用のGUIライブラリです。
ゲームやアプリなどに使えるウィジェットやコントロールを作成するための機能が手軽に使えるのでご興味がありましたら是非さわってみてください。


■DXRubyWSを使った作例など


というようなお題目で記事を書く予定だったのですが、カイリカさんが非常にわかりやすい記事を書いてくださったので今回はコード的な話ではなく作ったものを触っていただこうと思います。
つまり…自分で作ったものをただ紹介するコーナーです…!


■NFXとは


まずは自分がDXRubyWSで作成中のツールなるみんエフェクタ(以下NFX)をご紹介いたします。
NFXはパーティクルエフェクトを作成するためのツールです。

パーティクルエフェクトについてはここでは大雑把に『ある一点(あるいは領域)から放射状に画像を放出する映像表現』としておきます。

以下の三つの要素から成り立っています。

・PartsImage
パーティクル画像のデータクラス。
アニメーションで使うための画像ファイルの分割方法を指定するクラス。

・Parts
パーティクルのデータクラス。
簡易なキーフレーム方式でスプライトの拡大、回転、色調変化を設定する機能。

・Emitter
上述のスプライト(パーティクル)に速度と角度を与えて放出するエミッターの設定する機能。


現在はこの三つのクラスにパラメータを設定することができます。
とりあえずどういった物なのか実際に動かしてみたら感じがつかめると思います。
起動してパラメータを適当にいじってみてください。

Ocraでexe化したものがこちら 
一応コードはこちら
GitHubのNFXのページ


■なぜNFXなのか


こういったエフェクトはコードで書くことも可能なのですが、凝った物を作ろうとすると設定するパラメータは結構な量になると思います。
何よりパラメータを書く→ゲームを実行して確認→パラメータ修正→ゲームを実行して確認
この作業を繰り返すのはかなりしんどいのではないかと思います。
なので、こういった作業を視覚的に行えれば楽ちんだろうという考えのもとにNFXは開発されました。
作ったエフェクトはマーシャルデータとして保存されるので、ゲームに使う際はそのデータを読み込み実行用のコードをrequireすれば簡単に再生できます。
面倒な作業を省略し、ゲームの方のコードも見やすくできるのがこのようなソフトを利用する利点ですね。


■サンプル



さて、せっかくなので実際にNFXで作ったエフェクトをプログラムで利用してみましょう。

ocraでexe化した物はこちら
サンプルコード
GitHub AdventCalender2014のページ
main.rb


まずは必要なスクリプト群を読み込みます(多い)
それぞれエフェクトの実行コードやエフェクトデータや画像の管理なんかを行うクラスやモジュールです。
エフェクトのデータはそれぞれ$data_emitterと$data_particleに格納されます(変更可 )

# スクリプトの読み込み
require_relative 'Scripts/ntmodule' # 基本的なモジュール
require_relative 'Scripts/posteffect' # シェーダーの定義
require_relative 'Scripts/dataclass' # データ構造の定義クラス
require_relative 'Scripts/gamemodule' # ゲーム用モジュール
require_relative 'Scripts/gameobj' # アニメーション実行スプライトの定義

DataManager.load_effect # エフェクトデータの読み込み


ここからがエフェクトの利用法になります。

### トレイル用エフェクトの定義 ###
class Trail

def initialize
@effect = []
# トレイルエフェクト
@effect << Game_Emitter.new($data_emitter[5])
@effect << Game_Emitter.new($data_emitter[6])
@effect << Game_Parts.new($data_parts[6])
@effect << Game_Parts.new($data_parts[4])
# 爆発エフェクト
@effect << Game_Emitter.new($data_emitter[1])
@effect.last.finish # 自動でスタートするので一旦終了
end

# 爆発を表示
def display_bomb
# 爆発エフェクトが終了中なら爆発表示開始
@effect.last.set_up if @effect.last.finish?
end

def update
# 左クリックで爆発表示
display_bomb if Input.mouse_push?(M_LBUTTON)
Sprite.update(@effect)
@effect.each{|e| e.set_pos(Input.mouse_pos_x / Window.scale, Input.mouse_pos_y / Window.scale)}
end

def draw
Sprite.draw(@effect)
end

end

基本的な使い方はinitializeの部分にあるとおりです。
エミッターを使いたければGame_Emitterをnewして引数としてエミッターの設定データを渡してあげるだけです。
パーティクルは基本的にエミッターから放出して使いますが、単体表示したければGame_Partsをnewしてパーティクルのデータを渡しましょう。
あとは自動で再生が開始されます。
updateを呼ぶとカウントが進みアニメーションしていきます。
止めたい時はfinishで再生終了して待機します。
待機中のエフェクトの再生はset_up。
とても簡単ですね!
またエフェクトデータを与えて別のエフェクトとして再利用することもできます。

それでは実際に起動して見ましょう。
Windowが表示されたら画面内にカーソルを持っていきましょう。
マウスカーソルの位置に光が表示されます。
マウスカーソルを移動すると光も追従し軌跡を残します。
右クリックで爆発が発生します。

とまあこれだけの簡素なプログラムですが…派手なエフェクトが表示されるとなんか画面がリッチになった気がしませんか?


■おわりに


ゲームを作る上であったらうれしいエフェクト。
しかしこれをコードとにらめっこし、結果を頭で計算し設定するのは非常に大変な作業です。
可視化できたら楽なのに…
はじめはRGSSでエフェクト製作用のGUI作りを始めましたが操作性や画面解像度などいろいろな問題に直面しました。
DXRubyを始めてからしばらくした頃mirichiさんがDXRubyWSの開発を開始しました。
「これは!」と思ってWSを使って再び挑戦しましたが、これで作れるアプリはWindowsような見た目と操作感なのでとても使いやすい物になりました。
そしてそういったものがわりと簡単に作れるのがWSの魅力ですね!

さて次回は21日目
あおいたくさんの『DXRubyユーザーのための標準添付ライブラリ』です。
お楽しみに!
posted by 鳴海つかさ at 00:20| Comment(0) | TrackBack(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/107294359

この記事へのトラックバック