スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DXRubyでノベルエンジン作ってみた(AC用記事)

〈完成!>

こんにちは、みれいゆですー
今回の記事はDXRubyのアドベントカレンダー に向けて作られた記事となっています。
http://www.adventar.org/calendars/345
今回の私は12月23日を担当しました!!もうクリスマスも近い!!

前回は 役に立ちそうで役に立たない少し役に立つかも知れないDXRubyローグライクのノウハウ hoshi_sano さんでした!!
ローグライクは私もかなりはまってたゲーム種別ですね!!ちゃんとYAMLで内容をユーザーが変更できるのもうれしいところ
これまでのAC記事の集大成のような記事でした!!

さて、当の私はこれまでの自身の成長?の集大成(にはならなかったかもしれない)なものを作ろうと思って、考えたところ、
様々なゲームジャンルを探っていくとどうもフリーゲームで一人専用だと
「ノベルADV] これは非常に人気で数が多い事がわかりました!!

私にはノベルを書くような文学才能はありませんが型なら作れるぞ!!と思って今記事にとりかかった次第です。では、どうぞー




[DXRubyノベルエンジン作ってみた]

目標:ファイルの簡単な一部をユーザーが加えることで簡単にノベルを編集できる!!

用意する(した)もの(ソース)
以下の適当なファイルを用意しておく。
・背景画像 ・背景じゃない前に置くような画像、
・キャラクターの顔を含めない画像 ・キャラクターの顔の画像
<それぞれ拡張子は png !!>
・効果音に使うWAVファイル
・音楽に使うMP3ファイル

をそれぞれ1つ以上あるといいです!

今回作るソース・ファイルは以下の3つになります。

・main.rb ・・・メインですね。ここにノベルクラスを動かす為の記述を入れます。
・page.rb・・・Sceneクラス。これは汎用sceneモジュール
(http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%C8%C6%CD%D1scene%A5%AF%A5%E9%A5%B9)
を改造させていただきました!(パブリックドメイン)
・class.b・・・今回最も重要な、Classを管理しているファイルになります。




①:では、まずはpage.rb のソースだけちゃっと載せましょう!!

http://pastebin.com/7fMhfrET

#メインの定常処理はrun->render->update->exitとなる。
step.times do
break if page.Next_page
page.__send__ :__run
end

page.render

step.times do
break if page.Next_page
page.__send__ :__update
page.__send__ :__exit
end



ここが重要でして、フレームで動かすdefの順番を run->render->update->exit (描写前の処理、描写処理、描写後処理、終了用処理)としています。




②:class.rbを作ろう!!

さて、今回はユーザーが比較的に?簡単にコードを編集して音楽も画像も、もちろんノベルの文章も追加できるようにと考えていきました。そこで音楽、画像の導入には、”全てを配列に突っ込み、番号で処理できる”ようにしました。
つまりこうです。

@body , @face= [],[]
@body << @sample_body1 = Image.load('sample_pass/body_sample1.png')



画像をファイルパスからロードした画像を適当な変数で定義し、そのまま@body配列に突っ込みます。
この要領で音楽等もやっていきました。
次に文章はクラスに引数を設定する事で、非常に可変的に作ります。
ボタンですが(ここでは文字をボタンとした)、ボタンのサイズを得るためにこのようなコードを書きました。

button_size = [x..x + font.getWidth(sentence) , y..y + font.size]


として、

if button_size[0].include?($xpoint) && button_size[1].include?($ypoint)


これは、文字の大きさをrangeクラスで取り、マウスカーソルがその範囲に入ったかを意味しています!

なるべく抽象化する事で、立ち絵、背景等画像、音楽、文章、ボタンを下のようなクラスに纏めてどれも引数で処理ができるようになりました!!

http://pastebin.com/vfTRHa9S

本当に、抽象化を覚えてよかったと思いました!!

ここの引数は後に作る、ノベルを構成するクラスで全て設定ができるようになります・・・





本番のノベルを構成するクラスに入る前にここで息抜き?のクラス、
固定データの変更に用いる。Param_edit_class を作っていきます。
なぜ必要になったかはノベルクラスの際に紹介します・・・
結果は20行でできました。

http://pastebin.com/EZe9aCXt
ここのところ、 演算子を変数化できればもっと短く出来たところです!!(やり方があったらお願いします!!)




さて、本番のクラスです。ノベルクラスを紹介します。
ノベルに必要な事柄はなにか?と考えていったところ、必要な事柄をまとめました(あくまで個人の結果なので、もうちょっといいまとめ方があったらお願いします!)

・イベント開始条件 ・・・開始条件によって複数のイベントを分岐させる
・イベント結果分岐 ・・・正答度の概念によってイベント全体の結果を変える
・分岐判断待ちタイム ・・・これはボタンのタイムに同期させない理由は、瞬間的に出てくる分岐とかも作りたかった
・サウンドエフェクトタイム ・・・サウンドノベルはいつでも音を鳴らせるようにしたい!
・画像描写 ・・・画像、音楽も条件分岐によって滑らかに変えたい
・文章描写 ・・・大量の文章を構造化して編集がし易いように
・分岐ボタン描写 ・・・大量の条件分岐を構造化して編集がし易いように


にまとめ上げました。




class.rb の完成形がこちらになります!!

http://pastebin.com/fj0D15uQ

ここで最初んっと思ったところがあって、それは、
"一つの変数に対し、each メソッド上の変数を使ってeachした値は、基の一つ変数と関連性が無くなる"
という事です。つまりこのような事です。
sample_ary = [[2,"up",[[$sample_data[0],3],[$sample_data[1],-4]],-1],[2,"down",[[$sample_data[1],3],[$sample_data[2],-4]],-1]]
という配列があって、

sample_ary.each do |p|
p[2].each{|d| d[0] += d[1]}
end


このやり方では、$sample_dataのどの値も変化しないようですね!
何かというと、一回目のeachの時点で本来$sample_data各種であったはずの変数はp[2]配下のp[2][0]に姿を替えてしまったために、関連性が無くなってしまったのだと思います。

そのため上のような事をする為に息抜き?でやっていたparam_edit_classを呼び出して引数で直接変更させる変数を設定するようにしました。

今回はeachメソッドを使う機会が非常に多かったので、この仕様を見つけることができて感慨深いです。




③:main.rbで戻り値を使った総管理

最後にmain.rbと題して、上のClass_novel内の操作をどういった方法で使用するのかを決めます。
Class_novelの def initialize と def reinit 以外はこれからいかなる編集をする上では全く操作する必要が無いと入っていいでしょう!

http://pastebin.com/ABvHwWtK

Class_novel内のdefの使用順番は、
ifs->draw->effects->sentence->result->(ifs)->time->mind->reinit
となります。

main.rbのユーザーが手を加える時は、ゲームオーバー条件を定める必要がある場合です。
もしゲームオーバーが存在しないように作るならばこれも編集の必要がありません。




④:まとめ

今回のノベルエンジンコードでできる事は
・タイムワークで文章や効果音を流せる
・ボタンを押すことで物語の分岐を作る
・複数の開始条件と結果を作れる。(ゲームオーバーも用意できる)

やろうと思えば拡張はどんどんできます!!拡張しても負担がそれほどかからないのが抽象化されたクラスの特長ですね!!


最後に、このノベルエンジンを作る事は、DXRuby、Ruby言語で作る方法が非常に簡単でした!!まずほかの言語ではGUIを出すところから、(できれば高機能にできるかもしれないが)難しいところがあり、それをコマ送りのように動かすことはとても準備がいる作業でした。
DXRuby(Ruby)のイイトコロはぱっと思いついた構想をぱっと実現できるところだと思いました!!特にDXRubyはGUIアプリケーションを作る時にはかなり使いやすいですよ!!
最後に、ゲームのジャンルはノベルやシューティング、ローグライク以外にももっと様々あります。想像すればいつでも実現がしやすいDXRubyで、グラフィカルに再現してみませんか??

コードソースリンクがあちらこちらにあったので、完成形をここにまとめます。

・page.rb
http://pastebin.com/7fMhfrET

・class.rb
http://pastebin.com/fj0D15uQ

・main.rb
http://pastebin.com/ABvHwWtK




さて、次回は土屋つかささん t_tutiya さんです!!またDXRubyに纏わる短編物語を書いてくださるのでしょうか??
それとも・・・


ご閲覧ありがとうございました!!

スポンサーサイト

コメント

コメントの投稿

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。