装備機能拡張(2)


No.02 装備機能拡張(1)

※練習用ゲームファイルは前回のものを引き続き使います。

装備機能拡張(2)

3回に分けて装備画面を改造します。今回は2回目です。
今回は表示するステータスの数を増やします。
※ここから下の文章のパラメーターとステータスは同じ意味だと思ってください。統一されていませんので悪しからず。


Lesson1 改造場所の確認

前回に引き続き、改造場所は Window_EquipLeft に決定です。


Lesson2 initializeは何を呼び出しているのか?

前回、インスタンスを作成したときに自動的にinitializeが呼び出されると言うことは紹介したはずです。
今度は、initializeが何を呼び出しているかを調べましょう。
initialize
initializeはsuperとrefreshというメソッドを呼び出しています。superは前回やったとおりです。もう1つのメソッド、refreshはすぐ下に定義されていますね。
ちょっと見てみましょう。
refreshの最初のあたり
self.contents.clear は今回は無視します。clear は表示されているものを一旦すべて消しているという意味です。
問題は、27〜29行目です。draw_actor_parameter(無理矢理直訳:書け、アクター、パラメーター)というメソッドですが、直訳どおりこれがステータスを描画しているものです。
詳しく見るためにそのメソッドを探しましょう。
同じセクション内には無いみたいなので、スーパークラスを探さないといけないのですが、面倒なので検索機能を利用しましょう。
まず、draw_actor_parameterをコピーして、検索窓をだして…なんて面倒なことはしません。
最初に、スクリプト上のdraw_actor_parameterをドラッグします
上手な検索方法
次に、 Ctrl + Shift + F を同時に押します。そうすると、draw_actor_parameterがコピーされた状態で検索窓が開きます。ちょっとお得な方法です。
検索結果を見ると、Window_Baseが怪しいでしょう。Window_Baseはすべてのウィンドウのスーパークラスですから。


補足:case〜endについて。

ここを逃したら、case〜endを説明する機会がなくなりそうなので、ここで説明します。
case 変数名〜when○ 実行内容〜…〜else〜end で変数名が○の時、実行内容を実行します
具体例を用いた説明は下で。


Lesson3 7種類のパラメーター

先ほど補足したcaseの具体例を用いた説明をします。
case
上のスクリプトの赤い下線が変数名で、青い下線が○が0の時の実行内容です。
typeは第4引数なので、4つめの引数の値によって表示される値が変化します。(実際には変数が変化するだけだけど、意味的には同じ)

余談
atk → attack(アタック:攻撃)の略。攻撃力のこと。
pdef → pfysical-defense(フィジカル・ディフェンス:物理防御)の略。発音は違うかも…。
mdef → magical-defense(マジカル・ディフェンス:魔法防御)の略。
str → strenght(ストレングス:力)の略。腕力のこと。
dex → dexterity(デクスタリティー:器用さ)の略。デクステリティーかも…。
agi → agility(アジリティー:軽快さ)の略。素早さのこと。
int → intellect(インテレクト:知性)の略。魔力のこと。
発音には自信なし。


Lesson4 増やしてみる

さて、実際に使って見ましょう。
Window_EquipLeftの30〜35行目に次のスクリプトを追加します。
追加事項
第3引数は文字の表示位置の高さなので、計算式で簡略化します。128が138になっているのはミスではなく、管理人が見やすいと判断したためです。128でも問題ありません。

実際に確認しましょう。
成功図
こんな感じになればOKです。
装備を変更しようとすればわかると思いますが、これだけでは不完全です。
次はそれを改良します。


Lesson5 増やしただけでは物足りない。

今度のは、かなりどこを改良かがわかりにくいです。まぁ、36〜53行目のマネをすればいいのはわかりますが。
とりあえず、やれることをやりましょう。
54〜79行目に次のスクリプトを追加します。
追加スクリプト
赤い下線以外は上のをコピーすれば間違えにくいでしょう。
結果を確認しましょう。装備を変更しようとしても、変える前と変わりないですね…。(スクリーンショットなし)


条件分岐 if と特別な値 nil

if 〜 endで条件分岐と設定できます。
if は「もしも〜ならば」みたいな意味があります。(中学生以上なら説明しなくてもわかると思いますが。)
今回の条件は@new_○ != nilとなっています。
!= は否定です。if not @new_○ = nilと同じような働きをます。(実際は優先順位が違う)
ではnil(ニル)とは何でしょう?

nil とは、オブジェクトがない状態です。0やfalseに似ていますが、0やfalseはRubyではオブジェクトです。
ローカル変数以外の変数は初期値としてnil が設定されています
また、配列やハッシュも値が存在しないところはnil です。
これ以上書くとごちゃごちゃしてくるので説明は省略します。

つまり、if @new_○ != nilは「もしも、@new_○の値がnilじゃなければ次の処理を実行しなさい」という意味です。
@がつく変数はインスタンス変数なので、初期値は nil です。
なので、条件に当てはまらない→無視というわけです。


Lesson6 さて、どうするか?

答えはすぐ下に書いてあります。Window_EquipLeft最後のメソッドset_new_parameters。その説明は…
最後のメソッド
ということで、ここを変更します。
ちょっと長い
=beginと=endは行の一番初めにつけるとその間をコメントアウトすることができます。
一番初めじゃないと、エラーがでるので気をつけてください。
本来は再定義にあたるので、わざわざコメントアウトする必要もないのですが、一応。
あと if の条件を3行に分けていますが、1行目と2行目の一番終わりは or で終わらせないとエラーになります。 それと、109行目〜112行目は7行に分けても構いません。”;”は区切りになります。


Lesson7 そしてどうなる?

さて、確認しましょう。どうなるでしょうか?
初のエラー画面!
エラーですね。しかも、改造したところとはまったく別の場所で…。
Argument Errorは前回のまとめに書いてあるとおり、引数のミスによるエラーです。3for7なので、「7個必要なのに、3個しか渡していない」ということになります。
とりあえず、問題のScene Equipを見てみましょう。

スクリプトエディタを開けると、エラーが出た場所に移動しているはずです。
エラーが出た場所
set_new_parametersは先ほどいじったところなので、やはり、引数が問題のようです。
コメントにあるようにここではパラメーターを消去するだけなので、追加する引数はnilでいいでしょう。
よってこの部分を下記のように書き換えます。
書き換え
試してみるとわかりますが、今度は違う場所で同じエラーが出ます。
今度はそこを修正します。

しかし、このまま修正すると必ずエラーがでます。なぜなら、引数がローカル変数なので、追加する前に初期化しなければいけないからです。
ちなみに、new_atk・new_mdef・new_pdefは6行くらい上で初期化されています。
これをまねして、先に初期化しましょう。
初期化中…
それが終わったら、次に引数を書き換えます。
この画像は手抜きです。
2行に分ける場合は、必ずカンマ( , )の後で改行しましょう。
確認して、次のような画面になればOKです。
これで今回の改造はおしまいです。
次回は、装備変更時に能力が上がれば青、下がれば赤と言うように場合分けをします。


まとめ

そのうち書き加えます。

No.04 装備機能拡張(3)

このコーナーの感想はRPGツクールXP掲示板にでも書いてください。
管理人が喜びます。