【実践編】配列の各要素にアクセスする方法

はいどーも自分をプログラマだと思い込んでいるツミオですこんにちは。
前回の記事で配列へのアクセス方法はわかりましたね。
本日は実際にツクールMVでこの配列へのアクセスを使ってみましょう。

目標

目標は「スクリプトコマンドから簡単に実行できるトラップアクションと、報酬アクションの作成」です。
具体的には以下の通り

・イベントを実行したとき、条件を満たすメンバーが死ぬ
・イベントを実行したとき、条件を満たすメンバーが毒にかかる
・イベントを実行したとき、全てのメンバーが条件を満たすなら、メンバー全員のレベルを50まで上げる

こんな感じです。
まずは上2つのトラップアクションを作っていきましょう。
完成コードをさっさと見たいという方はGistsへどうぞ。

条件の作成

トラップアクションは条件を満たした各メンバーに対して実行されることとします。
ということで、まずは「条件」の部分を作成しましょう。
以下のコードをプラグインとして取り込んでください。

はい、こんな感じです。
Predicatesクラスは2つの静的なメソッドを持っています。
すなわちhpLessThanHalfとisMaxHPですね。
このvalueには$gameParty.members()から得られる要素が渡ってくることを想定しています(つまりパーティーの各メンバー)。

hpLessThanHalfはメンバーのHPが半分未満ならtrueを返します。
isMaxHpはメンバーのHPが満タンならtrueを返します。
そんだけですね。
特に難しいことはないと思います。
他にも条件はいくらでも増やせますよ。

トラップアクションの作成

次はトラップアクションです。

・条件を満たすメンバーが死ぬ
・条件を満たすメンバーが毒にかかる

この2つを作成しましょう。

というわけでさっそくコードをペタリ。

TrapActionクラスは3つの静的メソッドを保持しています。
すなわちfire、killMembers、addPoisonStateです。
外部から使ってほしいのはfireだけなのですが、JavaScriptではプライベートメソッドを作るのが七面倒なので、コメントでprivateとだけ示していますw
このへんが気に入らないなら、ご自分でちゃんとしたprivateメソッドを作成してください(C#なら簡単にできるんですけどねえ……)。

さて各メソッドの内容を見ていきましょう。
fireは引数にactionNameとpredicateを受け取ります。

actionName→実行するメソッド名
predicate→条件式(関数)

中身は単純です。
まず$gameParty.members().filter(predicate);で条件式に則ってメンバーを絞り込みます。
その後、絞り込んだactionMembersを各メソッドに渡し、実行させています。
this[actionName](actionMembers);がちょっとわかりにくい書き方になっていますが、例えば
this.killMembers(actionMembers);などと変換されることになります。

さてkillMembersを見てください。
これは受け取ったactionMembers($gameParty.members().filter(predicate);で絞り込んだ要素です)の全ての要素に対し、デスステートを与えています。
つまり死にます。

addPoisonStateも似たようなもので、こちらは毒ステートを与えます。

はいこれでトラップアクションはおしまいです。
イベントのスクリプトコマンドで

と書くと、コメント通りの動作をします。
第二引数には、最初に作成したPredicatesクラスの関数が使用されていますよ。
さっそくゲーム内で試してみてください。

なお、第二引数のPredicates.isMaxHPなどは関数オブジェクトを渡す必要があるのでPredicates.isMaxHP()とカッコをつけないでください。
カッコをつけてしまうと関数の実行を意味するため、正常に動作しません。

報酬アクションの作成

最後は報酬アクションです。

全てのメンバーが条件を満たすなら、メンバー全員のレベルを50まで上げる

これを作ります。

というわけでコードをポン。

RewardActionクラスは2つの静的メソッドを保持しています。

tryFire→全てのメンバーが条件に一致するとき、アクションを実行
upToLevelFifty→全メンバーをレベル50にする

まずtryFireを見てください。
先ほどと似ていますが、今度は$gameParty.members()に対してeveryメソッドを使用しています。
これは全ての要素が条件に一致したとき、tureを返すのでしたね。
続くif文で条件が満たされたかどうかを確認し、trueならアクションを実行しています。

upToLevelFiftyは、メンバー全員を強制的にレベル50にしているだけです。
難しいことはないですね。

ではこのクラスを実際にスクリプトコマンドから使用してみましょう。
こんな感じです。

注目してほしいのは第二引数です。
今回は直接関数を作成しています。
あらかじめ関数を作成していなくても、その場で関数を作成(無名関数と言います)することもできるんです。
これはTrapAction.fireにおいても同様です。
TrapAction.fireの第二引数に無名関数を指定することもできますよ。
今回はメンバーがレベル50未満かどうかをチェックしています。

余談ですが、無名関数を作成するなら、やっぱりアロー関数を使いたいですね。
残念ながらツクールMVのローカル環境はアロー関数に対応していませんが……。

全コード

最後の全コードを貼っときます。

ほなそんな感じで、また。

フォローする