KUROJIIBLOG

読者です 読者をやめる 読者になる 読者になる

遊戯道

俄か遊戯王カードコレクターです(苦笑)。遊戯王OCGとRPGツクールMVについて、勝手気ままに書き綴るブログです。新パック開封記事やレアカードの紹介、自作ゲームの進捗状況を主に書き綴っています。

第6話:イベント作成備忘録『パーティメンバー削除①』

RPGツクールMV RPGツクールMV-イベント作成備忘録

本日も筆者のメモ用に備忘録を書き綴っていく。

RPGツクールMVに手を出してから画像やBGM、プラグイン等素材集めのネットサーフィンに勤しむ日々が続いているが、筆者の探し方が悪いのか、その手のプラグインの需要がないのか、

 

単純にパーティメンバーを削除するプラグインがどこにもない。

 

これだけ書くとRPGツクールというソフトの機能性が疑われそうなので、もう少し書いておこう。

RPGツクールではプレイヤーが操るキャラクターはアクター(Actor)と呼ばれており、イベントコマンドを使ってアクターを追加したり入れ替えたり、パーティから外したりすることができる。操作も至って簡単。『メンバーの入れ替え』というボタンを押し、対象のアクターを指定して追加するか外すかを選ぶだけ。初心者ツクラーの筆者でも簡単に行える作業である。

ところが、だ。

アクターを直接指定して外すことは簡単なのだが、その時点で加入している不特定のパーティメンバー一人を選択して外すということがデフォルトの機能ではできない。

違いがよくわからないという人のためにもうちょっと突っ込んで話そう。

例えば、『Aさん』という固有キャラクターと出会い、仲間になるシーンがあるとしよう。この場合、ストーリーの流れで『Aさん』が仲間になることは必然であるため、作り手は『Aさん』というアクターを作り、必要なタイミングで『Aさん』を仲間に加えるという作業を行う。つまり、あるキャラクターがある場面で確定的に仲間になる or 外れる状況の時にアクターを直接指定して加入させる or 外すことができるのが、デフォルトで付いている機能なのである。

しかし、筆者が作っているのはポケモンメガテンなゲームだ。イベントによる固有キャラクターの加入・離脱は当然として、プレイヤー側が好きなキャラクターを加入・離脱させるシステムも実装しなければならない。そして、そのシステムを実装すると、プレイヤーがどのタイミングでモンスターを捕獲し、モンスターをパーティに加入 or 離脱させるかは制作者側では絶対にわからないので、固有のアクターを指定するのではなく、その時点で加入している不特定のパーティメンバーを選択して加入 or 離脱させる機能が必要なのである。

RPGツクールMVのデフォルト機能ではできないので、プラグインを導入するか、スクリプトでシステムを作り上げるしかない。自慢じゃないが、

 

筆者はプログラミングやスクリプトやらはチンプンカンプンである。

 

素晴らしいことに不特定のキャラクターをプレイヤーの任意で加入させることができるプラグイン(『DreamX_CaptureEnemy』)が公開されていたので、加入の問題はクリアーできた。

しかし、離脱の方はいくら探しても見つからなかったのである。

そんなわけで、

 

プログラミング超ド素人がシッチャカメッチャカしながらスクリプトを作ってみた(爆)。

 

色んなホームページでJavaScriptが説明されていたが、とにかく訳がわからなさ過ぎて、これを作るのに丸一日が消し飛んでしまった……。こういう異次元語を駆使してスラスラとシステムが構築できる人は本当に尊敬する……。

今回、筆者が必死になって作ったシステムは、熟練者から見ればもっと効率のいいやり方があったかもしれないが、プログラミング超初心者ということで優しい目で見て頂きたい(もっと簡単なやり方があれば是非ご教授を……)。

筆者がホームページを参考に見よう見真似で組んだスクリプトはこちら。

 

if($gameParty.size() == 2){this.setupChoices([[$gameParty.members()[1]._name,'キャンセル'],1,0,1,0]);

this.setWaitMode('message')};

 

簡単に言えば、選択肢を画面に出力させるスクリプト

$gameParty.size() == 2 でパーティ全体の人数を参照し、2人ならその後のスクリプトを実行。

this.setupChoices で選択肢として表示させる項目を指定。$gameParty.members()[1]._name でパーティメンバーの2番目(1番目を指定したい時は0を入れる)の名前、'キャンセル'で『キャンセル』という文字を表示させるよう指定。

キャンセルの後の4つの数字は左から順番に以下に記載。

 

①ESCキー押下によるキャンセルした場合に選ぶ選択肢の番号。

②デフォルトといい、選択肢画面が出た時の最初のカーソル位置をどの選択肢に持ってくるか。例えば、0を入れると一番上、4を入れると上から5番目の選択肢にカーソルがいく。

③選択肢のウィンドウ位置。0:左、1:中央、2:右

④背景。0:ウィンドウ、1:暗くする、2:透明にする

 

this.setWaitMode('message') は正直まったくわからん。選択肢をメッセージとして画面に出力させる設定なんじゃないかと勝手に思ってる。

ここで一旦スクリプトを区切り、以下のスクリプトをすぐ下に配置。

 

$gameVariables.setValue(2,this._branch[this._indent]);

 

$gameVariables.setValue で変数を代入。『2』はどの変数番号に代入するか指定、それ以降の部分は代入する数値。

例えば、パーティメンバー二人目のアクター名がホゲホゲだと仮定した場合、上記スクリプトの動きは以下。

 

//以下の選択肢が画面に表示

 

ホゲホゲ

キャンセル

 

ホゲホゲを選択した場合、変数番号2に0が代入。キャンセルを選択した場合、変数番号2に1が代入される。

 

表示される選択肢の一番上は0値(そこから下にいくにつれて+1加算)になるので、選択したパーティメンバー番号と代入される変数値が一致しない点に注意。

これで変数番号2に0か1が入るので、ここから代入された変数番号を参照し、0なら2番目のパーティメンバーを削除、1なら選択をキャンセルする動きを作っていく。

イベントコマンドの『条件分岐』を使い、変数番号2の値が0の場合の条件分岐を作成。

次にイベントコマンド『変数の操作』を使い、別の変数番号(ここでは変数番号3とする)に2番目のパーティメンバーのアクターID値を代入。

そして、以下のパーティメンバー削除のスクリプトを作成。

 

var i = $gameVariables.value(3);

$gameParty.removeActor(i);

 

var i = $gameVariables.value(3); で『 i 』という文字の値は変数番号3の中に格納されている値であるという指定を行い、$gameParty.removeActor(i); で『 i 』の値のアクターIDを持つアクターを削除する。

 

これで削除の動きは終了。

キャンセルの動きは再び『条件分岐』を使い、変数番号2の値が1の場合の条件分岐を作成。

その後は何も入れなくてOK。キャンセルを選択したら何も起こることなく、選択肢が消える。味気なければ、「キャンセルしました」みたいなメッセージを入れてみてはいかがかと。

ちなみにキャンセルの選択肢はなくてもいいが(キャンセルボタン押下でキャンセルできるため)、あった方が親切かと思い、導入した次第。

 

とりあえずは、以上。

正直、自分で書いていて意味不明だったので、読んでわからん場合は見なかったことにするか、下の参考画像を見て納得して頂きたい。

f:id:kurojii:20160718183828p:plain

 

今回のスクリプトはパーティメンバーが二人の時にしか使えない。パーティメンバーがぴったり二人なら選択肢が表示されるが、一人だったり三人以上だと選択しそのものが表示されないのだ。三人以上のパーティメンバーになるなら、上記スクリプトの選択肢とそこから派生する条件分岐を増やしていかないといけないし、パーティが一人だけになる可能性があるなら、一人の場合は削除を受け付けてくれないメッセージを出すなどの動きが必要になってくるので注意が必要である。

筆者はここから選択肢と条件分岐を増やしていき、最大8人パーティに対応できるようにした。正直なところ、9人以上のパーティに対応させたかったのだが、パーティメンバーのアクターIDを取得するという動きが8人までしか対応していなかったので断念した(9人目以降のパーティメンバーが内部定義されていないため)。

例えば、イベントコマンド『変数の操作』のオペランドにあるスクリプト欄に $gameParty.members()[7].actorId と入力すればパーティメンバー8番目のアクターIDを代入するのだが、これを $gameParty.members()[8].actorId で9番目にしても、定義されていないというエラーメッセージが表示されてしまう。おそらくプラグインが作れるくらいの猛者なら9人目以降のパーティメンバーを定義してしまうことが可能なのだと思われるが、筆者は完全初心者なので不可能。誰か9番目以降のパーティメンバーのアクターIDを取得する手段をご存知なら、是非教えて頂きたい。

 

※補足

『代入』と『加算』は意味がまったく違うので要注意。イベントコマンド『変数の操作』でどちらも指定できるが、加算は指定数値分を足していくのに対し、代入は指定した数値に置き換えるので注意しよう。

 

というわけで、本日はこれまで。

RPGツクールMVを触っていない方にとっては非常につまらなく、触っててもスクリプトを知らない方にはチンプンカンプンだったと思う。筆者も上で偉そうに書いているが、切れ端の切れ端くらいの理解しか出来ていないのが実情。あくまで備忘録ということでご理解頂ければ幸いである。

それではまた、次の記事でお会いしよう。