RPGツクール向け素材>メモ書き>VX系

3) スクリプトの作り方



ehimeは,CやC++言語は勉強しましたが,Ruby言語は全く勉強していません(2008年夏現在)
そんなehimeが贈る,スクリプトの作り方.

ここでは,スクリプトの作り方の概念を紹介しますが,詳しい文法は自分で勉強してください.


とりあえず,目標を持ってスクリプトを作りましょう.
今回の目標:オリジナルのステータス画面作成!

<ステップ1> 基礎:で,どうすんの?

<ステップ2> 応用:実際作ってみよう!(〜命中率表示まで)

<ステップ3> 応用:実際作ってみよう!(ステート耐性)

<ステップ4> 応用:実際作ってみよう!(経験値のゲージ)

<ステップ5> 応用:実際作ってみよう!(スクリプトの整理〜完成!)

<ステップ6> 応用:実際作ってみよう!(おまけ)


















<ステップ1> 基礎:で,どうすんの?

まず,スクリプトを開きましょう.



左のメニューから,「▼素材」の「(ここに追加)」を選択して,
右に表示されている緑色の文章を読んでください.

要約すると,この「▼素材」という欄に,
配布されているスクリプト素材を貼る,もしくはこれから自分で作成すれば,O.K.ということです.


半信半疑ですが,とりあえず先へ進みましょう.


先ほどの緑色の文章に
(左のリストボックスのポップアップメニューから「挿入」を選択します)
と書いてありました.

左のリストボックスを選択してから,右クリックでポップアップメニューを出して,挿入….



欄一個増えたよ,ママ!


下の「名前」を選択して,これから作るスクリプトの名前をつけましょう.

すると自動的に,リストボックスの選択している項目の名前も変化します.


今のところこんな感じです.



真っ白な画面を見ると,頭の中まで真っ白になりそうですが…,ここで今回の目標を思い出しましょう.

今回の目標:オリジナルのステータス画面作成!


つまり,ステータスのウィンドウ画面を触ればいいんだな.

次に,左のリストボックスから「▼ウィンドウ」を探して,
更にステータス画面に関係ありそうなウィンドウを探してください.

Window_Statusが,ステータス画面に関係ありそうなウィンドウっぽいですね.


見つけたスクリプトの中身をコピーします.
(Ctrl + A : 全選択 → Ctrl + C : コピー)


先作った新しいスクリプトの中身に,コピーした内容を貼り付けます.
(Ctrl + V : ペースト(コピーした内容貼り付け))



コピペが終わったら,これから作るスクリプトに名前をつけましょう.
ついでに説明文も.



ここで試しにテストプレイ


初期のステータス画面って,こんなんだ…という確認.


因みに,スクリプトの中身がこれでも,同じステータス画面になります.
 → 


次は,スクリプトの中身のいじくり方について説明します.


ひとまず,「● オブジェクト初期化」と「● リフレッシュ」以外は消してください.

ここで,class は end で,def も end で締めくくってください.
でないと,エラー出ます.
深いことを考えず,class -end, def - end で1セットだと思ってください.
(defは,英語のdefine(意味:定義)の略だと思われます)



ひとまず,「● リフレッシュ」にあったdraw系を全部消して,
自分で作ったdefの名前(test_def)を書きました.
そして,test_defを新しく定義します.


テストプレイで確認した,今のステータス画面です.

何も無いです.
先ほどdraw系のdefを全部消した上,新しく入れたtest_defに何も記述していませんから,当たり前です.


では,新しく定義したtest_defを記述していきましょう.


例で記述した文章の内容は適当ですが,文章を記述する時は""でくくります.
draw_textは,文章表示に使用するもともとRubyにある定義式(メソッド)です.


テストプレイで確認した,今のステータス画面はこうなります.
きちんとtextの文字が表示されています.


では,次の場合はどうなるか…?


同じ名前の定義(今回はteat_def)があった場合,どちらが優先されるでしょう?
>


答えは,下の新しい定義の方です.



このように,VXのスクリプトでは,新しい定義が優先されます.
その特性を利用して,現在使用されている定義やclassなどを新しく定義しなおすことによって,
自分の好きな表示や機能を追加していきます.



<ステップ2> 応用:実際作ってみよう!(〜命中率表示まで)
<ステップ3> 応用:実際作ってみよう!(ステート耐性)
<ステップ4> 応用:実際作ってみよう!(経験値のゲージ)
<ステップ5> 応用:実際作ってみよう!スクリプトの整理〜完成!)
←戻る





<ステップ2> 応用:実際作ってみよう!(〜命中率表示まで)

今から,実際にスクリプトの中身をいじくって作っていきます.

今回の目標の再確認
今回の目標:オリジナルのステータス画面作成!

スクリプトをいじくる前に,頭の中,もしくは紙に書いて完成予想図をイメージします.
(左:従来のステータス画面 → 右:今から作るオリジナルのステータス画面完成予想図)
 → 
(今回の完成予想図は,茶の助さんからお借りしています)

ではまず,「▼素材」に新しくオリジナルステータス画面用の欄を追加します.
追加後,スクリプトの土台となる既存のスクリプト内容をコピペします.
(今回はWindow_Statusをコピペ)

現段階はこんな感じです.
(Window_Original_Statusと命名)



コピペが終わったら,従来のステータス画面と,完成予想図を比較します.
比較後,違うところをチェックします.
(左:従来のステータス画面   右:今から作るオリジナルのステータス画面完成予想図)
   


次に変更に関係がありそうなdefと行を見つけます.

今回「● リフレッシュ」に関係ありそうな行を見つけました.



4つ目の「基本的情報」が英単語読んだだけでは何を意味しているか分かりません.

そういう時は,文字列をコピーして,検索をかけて調べます.
文字列をコピーして…


右クリックした後,検索を選択


検索開始!


「def」と文字列の前についていた場合,その文字列の定義をしている場所です.文字列の意味を知りたい場合は,「def」がある場所に飛ぶと分かります.
「def」が前に無い場合は,その定義の使用例です.使用の仕方を知りたい場合は,こちらに飛びます.

今回は意味が知りたいので,「def」に飛びます.


「基本的情報」は,アクターのレベル,現在のステート,HP,MPの表示関係の定義式だと分かりました.


(今回は検索対象が,同じclassの「● リフレッシュ」のすぐ下にありましたが,時には違うclassにある場合があります)

現段階で分かったことを,メモ書きにして残します.
半角の「#」の後が全てコメント文になります.
このようにちょくちょくメモ書きを残すと,後で見直しする時に楽です.



先ほどチェックした従来のステータス画面を見て,いじくるところを考えます.
   


まずは,職業とレベルが要らないので,消します.
消し方は,その行をまるまる消してもいいのですが,
「消す行間違っちゃった☆」
と後で後悔しない為にも,とりあえず「#」でコメント文にして消します.


ここで,テストプレイで確認
   
職業とレベル消えてます.

次は,名前を右に移動させます.
   

名前の定義「draw_actor_name」を,どうにかすれば右に移動するだろう〜と考えます.
そういえば,後ろの引数の意味は何だろう…?

意味を知りたい時は,先ほど紹介した検索の仕方で,「def draw_actor_name」を探します.

検索〜



発見!

引数1は,アクター.引数2と3が表示する座標ということが分かります.

つまり,引数2と引数3の数字を変えれば,アクターの名前表示場所が変わる!ということです.

Window_Original_Statusに戻って,実際に引数2と引数3の数字をいじくってみる.


で,テストプレー
   


次は,顔とHP・MP,経験値を上に移動させます.

同じように顔グラとHP・MP,経験値表示の定義の引数を見て,
座標移動に関する引数の数字を変更します.
(y座標32→0)


で,テストプレー
   

同じように,パラメータと装備も上へ移動させます.

↑のように数字への代入は数式でもOK

で,テストプレー
   

少しは,完成予想図に近づいてきた感があります


次は,パラメータを2列表示にします.

パラメータ表示に関する「def」を検索して探します.


完成予想図を確認すると,攻撃力と防御力が同じ高さ.精神力と敏捷性が同じ高さです.
それを基に,x座標とy座標を変更します.

(見やすくするためにスペースを空けるときは,tabか半角スペースで.
全角スペースを使用すると,エラーになります.)

で,テストプレー
   

2列になりました.
しかし,数字と文字が重なっています.
「攻撃力」の一つの項目の幅が広いためです.
次はこの幅を狭くします.

この幅はどこで調整できるのか…?

先ほど変更した「def draw_parameters」の中にあった「draw_actor_parameter」が怪しい…と当たりをつけて,この「draw_actor_parameter」の「def」を検索して探します.


見つけたら,幅変更に関する場所を探します.

draw_textが怪しいです.

このdraw_textの引数のどれかが,幅変更に関係しているのでは?と考えます

しかし,どの引数が関係しているのか分からないので,再びdraw_textを検索します.

検索したら,どこにも「def draw_text」がありません.

検索しても「def」が出てこない定義は,たまにあります.

こういう定義について,どうやって調べるかというと…

画面右下にある「ヘルプ」をクリックして下さい.


すると,↓のような画面が表れます.


ここで再度,「draw_text」について検索すると….

ありました,ありましたよ!!

このようにヘルプの中である定義は,元々RGSS2の中にあるやつです.
(また,「ヘルプ」にはスクリプトについて色々書いているので,
スクリプトについてもっと知りたい方は読んでみてはいかがでしょうか?)

で,結局問題の「draw_text」の引数は…,
引数1と2が座標,引数3が「width」と説明に書いています.
これらの引数の数字を変更すれば,いいんだなということが分かりました.

先ほど,怪しいと睨んだ,「draw_actor_parameter」に戻ります.

ここ怪しいと睨んだ,「draw_text」の引数を変更すればOKということが分かってます.

しかし,直接「class Window_Base」の中にある「draw_actor_parameter」を変更しないほうがいいでしょう.

ステータス画面以外にも,この定義は使われている可能性があります.
(検索して調べたら,実際使われていました)
ここを直接変更したら,他のシーンに悪影響がでるかもしれません.

そういう時は,「draw_actor_parameter」のみをコピーして,


「class Window_Original_Status」の適当な場所にペーストします.

ペースト後,数字を変更します.

このようにすれば,「class Window_Original_Status」のみに使用する「draw_actor_parameter」ができるため,他のスクリプトの競合を考える必要がありません.

で,テストプレー
   
パラメータが2列になった〜!

次は,命中率と回避率をこのパラメータに足します.

「class Window_Original_Status」中の「draw_actor_parameter」を参照してください.

何やら,typeによって攻撃力や防御力など分類しています.
ここを変更すれば,命中率や回避率が足せるかも〜と考えます.

攻撃力や防御力が記述しているのと同じノリで,命中率や回避率を足します.
(case などのスクリプトの意味・使い方は「ヘルプ」に載っています)


スクリプトを見ると,parameter_nameが「攻撃力」などの名前,parameter_valueがその値っぽそうです.
ということは,parameter_nameに「命中力」や「回避率」の名前を入れて,parameter_valueにそれぞれの値を入れればいいのでは?と考えます.

問題は,「Vocab」.
「Vocab」って何?????

実は,「Vocab」はここにあります.

「Vocab」は英語の「語彙:Vocabulary」の略だと思われます.
要は,言葉集です.

この「Vocab」の中から,パラメータに関する記述を探します.

おお,あった,あった.

これで,命中率も「Vocab::」のように記述すれば,いいのでは?

….

「Vocab」の他の場所を探しても,命中率に関する記述が見当たりません.

あれ?

念のため,データベースの用語を見ましたが,命中率,回避率にかんする言葉の設定がありませんでした.



….

こういう時は,自分で勝手に語彙を作ります.

方法1:直接打ち込む
""と半角で囲んだ間に名前を記述します.


方法2:自分で「Vocab」を定義する
↓のように定義します.
 
スクリプト素材として配布する場合は,こちらの方法をとります.

また,actor.hitやactor.evaは自分勝手に名前をつけているのではなく,
「Game_Actor」で定義されているものを使いました.



「def draw_parameters」を変更して,命中率や回避率が表示されるようにします.


で,テストプレー.
   


同じ容量で「def draw_parameters」を変更して,
回避率やクリティカル率が表示されるようにすることも可能です.
 

で,テストプレー.
   
段々と完成予想図に近づいている気がします.




<ステップ1> 基礎:で,どうすんの?
<ステップ3> 応用:実際作ってみよう!(ステート耐性)
<ステップ4> 応用:実際作ってみよう!(経験値のゲージ)
<ステップ5> 応用:実際作ってみよう!スクリプトの整理〜完成!)
←戻る





<ステップ3> 応用:実際作ってみよう!(ステート耐性)

今回の目標の再確認
今回の目標:オリジナルのステータス画面作成!

で,現在の進行状況
(左:現在のステータス画面   右:完成予想図)
   

ステート耐性がありません.

従来のステータス画面にもそんなものありません.

無い場合は,自分で作ります.


無いものを作るときは,「説明書:RPGツクールVX マニュアル」でステート耐性について確認します.
(時には,「ヘルプ」で確認)

マニュアルの第3章の職業の設定(p.35)で,ステート有効度について記述しています.
他のアクターのステート耐性に関係ありそうな箇所は…,防具ですね.

よって,アクターのステートに対する耐性は,職業+防具の値です.


とりあえず,アクターごとのステート耐性の数字を拾うため,
検索で「ステート」と探します.


沢山出てきました.
けれど,今回は「対象がアクターである」,「ステートに対する耐性が知りたい」ので,
「Game_Actor」の↓の行に当たりをつけます.


説明書によると,ステートの耐性を何%と設定できるのは職業で,
ステートを無効化と設定できるのは防具らしい.

兎に角,「state_probability」と,「state_resist?」がステート耐性に関係がありそうだ.

ステート耐性をステータス画面に表示するための土台を作ります.
「class Window_Original_Status」のリフレッシュに,
ステート耐性表示用の「draw_state_probability」を作りました

新しい定義の名前なんて適当です(._.*)他の定義の名前と被らなければいいのです

次に,新しい定義の中身を作ります.


ひとまず,この定義が無事に使用できるか確認するため,
中身を適当に記述してテストプレーで確認します.
(中身は,<ステップ2>で散々いじくった「draw_actor_parameter」を参考にして書いています)


で,テストプレー
   
おお,いい感じに"毒"って表示されているやん.
横の60という数字は,60%の60で,ステート有効度Cに該当します.

先ほどは,直接"毒"と記述しました.
次は自動的にステートの名前を代入したいと思います.

ステートの名前確認

初期ステータスは,16個あるんだ…多いね.

データベースで作成しているものは,大抵$data_XXXXの名前で引っ張り出すことができます.
(詳しくは「ヘルプ」の「データベース」を参照)

ステートのid番号1番の戦闘不能の名前を代入したい場合は,
$data_status[1]と記述します

で,テストプレー
   
戦闘不能が表示されているね.

これを,ループ文を使用して全てのステートに適用します.

ループ文は,for文を使用しました.
iを1〜16まで変更するというループ文です.
このfor文,記述方法はC言語と違うけど,概念は一緒です.
(詳しいfor文の使い方は「ヘルプ」参照)

で,テストプレー
   
各ステートの名前を取得して表示していることが,確認できました.
しかし,2列に分けていないため,途中から切れてる….

次は,2列に分けます.

ステートのid番号が奇数の時は左に,偶数の時は右に配置するよう記述します.
数式の%は余りを算出します.
2で割った余りが1ならば,奇数.
2で割り切れたならば,偶数となります.

で,テストプレー
   
2列表示できました.
しかし,ステートが多いから,2列表示しても途中で切れています!

アクターのパラメータ,ステート耐性,装備を全体的に上に移動させて,
最後まで表示させてもいいのですが….

攻撃力上昇など,プラスのステート変化に拒否するアクターは早々いないだろう.
→プラスのステートは,ステート耐性に載せない

この流れで行きましょう〜!


unlessの条件文で,ステートのid番号9,10,11,12以外のみ記述すると書きます.

で,テストプレー
   
いい感じになりました.

ステート無効化防具を装備した時,その無効化分をまだ反映させていないので,
↓のように記述して,防具装備の時も対応させます.


確認のため,レザーシールドに毒無効化をつけて,テストプレー
   
時には,ウルリカ姉さんでw
毒無効化が反映されているのが確認できました.

<おまけ>

1.ステートアイコンをつける.
icon表示の定義と数字をいじくって,場所を調整します

で,テストプレー
   

2.数字表示からA〜F表示にする
state_valueを以下のようにして,場合わけをします.

text_color(n)は文字色を設定できます.
nは0〜32までで,Windowの文字色に対応します.
(→文字色参考)

で,テストプレー
   
大分,完成予想図に近づいてきたかな?

今回はここまで,ステップ4に続く


ここまでのスクリプト作成例をこちらにupします.
上記の説明と数字など少々違うところはありますが,参考にお使いください.
(参考は,<おまけ>の1,2の両方含んだスクリプトです)

<ステップ1> 基礎:で,どうすんの?
<ステップ2> 応用:実際作ってみよう!(〜命中率表示まで)
<ステップ4> 応用:実際作ってみよう!(経験値のゲージ)
←戻る





<ステップ4> 応用:実際作ってみよう!(経験値のゲージ)

次は,経験値ゲージを入れます.

経験値のゲージは,当サイトでスクリプト素材として配布されているので,それを使用します.

次のレベルまでをゲージ表示にする(別窓)

オリジナルのウィンドウのスクリプトの下に,↑のスクリプトの内容をコピペ



で,テストプレー
   

経験値のゲージ終了…って,終わるのも味気ないので,
この後はゲージの作り方の基礎知識についてを説明します
(興味ない人は,飛ばしてOK)


↓が,経験値のゲージ表示の主となるスクリプトです.

このスクリプトのうち,「gw」が現在の経験値に応じたゲージの幅(gauge width)です.
(初期ならピンク色のゲージ)

ゲージは2枚の長方形が重なって表示されています.


黒い長方形と,色付きの長方形が,
重なって↓のようなゲージの表示になっているわけです.


長方形が重畳しているんだ〜という目線で,
もう一度,HP,MP,経験値のゲージを見てください.
   
全然,長方形2つ重なっているんだという感じしませんね☆

次は,gwの長さの決定方法について説明します.

経験値のゲージの計算式はややこしいので,
式が簡単なHPのゲージで説明します.
HPのゲージ表示は「Window_Base」にあります.


gwは,

一次関数: y=ax+b (a:傾き,b:切片)

で求めています.因みに,現在は中2の数学で習います.

HPのゲージ式では,
y が gw
x が actor.hp(アクターの現在のHP)
a が width/actor.maxhp
b が 0
に相当します.
当たり前のことですが,現在のアクターのHP(actor.hp)を入力として,ゲージの横幅(gw)を出力していることが分かります.

何で傾きaがwidth/actor.maxhpかというと,

傾きaつまり,変化の割合aは,yの増加量/xの増加量で求めることができるからです.


変化の割合a = yの増加量/xの増加量 = yの増加量max/xの増加量max = width/maxhp
で,現在のアクターのHP(actor.hp)を入力として,ゲージの横幅(gw)が求まり,
↓のようなHPゲージとなります.
   

中学校時代に関数習った時に
「こんなのいつ役に立つんだ〜?!」
と思っていたけど,ゲーム作成時のゲージ表示に役に立ちましたね.

今回はここまで.



<ステップ1> 基礎:で,どうすんの?
<ステップ2> 応用:実際作ってみよう!(〜命中率表示まで)
<ステップ3> 応用:実際作ってみよう!(ステート耐性)
<ステップ5> 応用:実際作ってみよう!スクリプトの整理〜完成!)
←戻る





<ステップ5> 応用:実際作ってみよう!(スクリプトの整理〜完成!)

ステップ4までで,オリジナルステータス画面に欲しい機能(デザイン)は終わりました.

じゃあ,もうスクリプトの作り方は終わりじゃないの?

いえいえ,最後の仕上げが残っています.
スクリプトの整理をしなければなりません.

RGSS2では,同じ名前のclassやdefがあった場合(これを競合と言います),
新しく定義されたほうが優先されます.
ということは,同じ名前のclassやdefは無いほうがいいのです.

〜ehime流スクリプトの整理の仕方〜

少しでも変更があったdefの説明文にある"●"を"○"に変えるなど,
一目見ただけで分かるマークをつけます.
(ehimeは,"●"のマークを変える作業は,スクリプトを作りながらしています)

またそのdefが,元々あるdefの中身を変更しただけならば<変更>と
新しく自分で作ったならば<新規>とメモを残すと,
後で見直す時(競合問題が発生した時など;;)に,役に立ちます.
大概,<新規>競合問題には関係ないからね(・v・)

Window_Original_Status内の全てのdefを見直した後,
マークが"●"のまま残っているdefを全て消します.

で,テストプレイ
   
画面が,def消す前と変わらなければ,きちんと整理できたということです.

ここまでくれば,後は

のように,スクリプトの始めか終わりに「私が作りました印」を付けてください.

>最初から最後まで,オリジナルステータス画面のスクリプトを自力で作った方へ
著作権はehimeではなく,スクリプトを作ったあなたにあります.
どうぞ,あなたの「私が作りました印」を刻んでください.


以上で完成です.
今回の目標:オリジナルのステータス画面作成!
達成〜!!


ここまで読んで頂き,ありがとうございました.


<ステップ1> 基礎:で,どうすんの?
<ステップ2> 応用:実際作ってみよう!(〜命中率表示まで)
<ステップ3> 応用:実際作ってみよう!(ステート耐性)
<ステップ4> 応用:実際作ってみよう!(経験値のゲージ)
←戻る


最後に,完成予想図を提供して下さった茶の助さんへ
ご協力,本当にありがとうございました.