RPGツクールMVで複雑なゲームを作る時は
「オブジェクト指向」という考え方で作りましょう!というお話です。
この記事の対象者:
- オブジェクト指向は知らないが、ツクールでバグを起こしがちで悩んでいる人
- オブジェクト指向を知っていて、ツクールに取り入れたい人
ただし、JavaScriptは書けることが前提です。あしからず。
#オブジェクト指向って何?
あまりいい加減な説明をするとオブジェクト指向警察に逮捕されてしまうので
オブジェクト指向そのものについて詳しくは解説しません。
ですが、幸いにもツクールには一部オブジェクト指向が取り入れられた機能があるのでそれで説明いたします。
##あれれ、またバグだ…
ツクールの変数って、面倒ですよね。
あるイベントを起こすとまったく関係ないイベントがバグりだし、何が原因かと調べてみるとまったく関係ないところですでに使っていた変数をうっかり再利用してしまったとかだったりします。
こうしたミスを防ぐべく、賢い人達はセルフスイッチという対策を考えました。
これは、皆さんも知っている通りマップイベント毎に独立したスイッチです。それぞれのマップイベントで別々の値を取り、他のマップイベントからは参照できません。
これならば他のマップイベントで勝手に使用されてバグに悩む、ということはなくなります。
このセルフスイッチをもっと拡張できたらゲーム作りが楽になると思いませんか?
「4つだけでなくもっと、しかも数字や文字を代入できたら…」
バグを防ぎわかりやすいゲーム作りをするためには、たった4つの特別なスイッチだけでなく、
あるマップイベントの内部でしか使わないような変数はすべて、
そのマップイベントにひも付けられ、そのマップイベントからしか利用できないようにしてしまえば良いのです。
しかしセルフスイッチが4つまでというのはツクール側で決まっていることです。
そこでJavaScriptを用いてこの「ひも付き変数」を拡張していこう、というのが本記事の趣旨です。
また、この他にも移動ルートの設定などで登場するこのイベントというフレーズも実はオブジェクト指向的な考えです。詳しくは次回。
#実践
それでは実際にやってみましょう。ここではいずれもイベントコマンド「スクリプト」を使用します。
##プロパティに値を代入
this.character(0).property = "hensuu"; //propertyにhensuuを代入
this.character(0).property = $gameVariables.value(1); //propertyに(ツクールの)変数1番を代入
これからはさっき述べた「ひも付き変数」のことをプロパティと呼ぶことにします。
さて、そもそもJavaScriptはオブジェクト指向をサポートしているので、
ご覧のようにthisというキーワードを使えば「自分自身」を指してくれます。
ただし注意しなくてはいけないのはthis.property
としてはいけないことです。
「スクリプト」コマンドにおけるthisはGame_Interpreterという「イベントコマンドを順番に処理する機構」を指しているので、this.character(0)
と書いて「このGame_Interpreterを起動したマップイベント」を取得しなければいけません。
##プロパティの値をツクール変数に代入
$gameVariables.setValue(1, this.character(0).property); //変数1番にhensuuを代入
このように書いても良いのですが、代入だけならば実は「変数の操作」コマンドに「スクリプト」という項目がありますのでそこにthis.character(0).property
と直接書いた方がタイプ数が少なく楽です。
後述の理由でなるべくスクリプトは書かないほうが良いので、「変数の操作」でプロパティをツクール変数に代入→イベントコマンドで処理、というパターンを習得しておいたほうが良いでしょう。
なお、ツクール変数はfalsyな値(空白文字列とか)を代入されるとすべて0に変換してしまう仕様があるのでそこだけは注意しましょう。
###その他に「スクリプト」を書けるコマンド
「条件分岐」コマンド及び「移動ルートの設定」に「スクリプト」という項目があります。
ただし移動ルートの設定の場合のみなぜかthisがイベントそのものになっているので、this.character(0)
とは書かずに単にthis
と書きましょう。
##注意:すべてスクリプトで書いてはいけない
さて、ここまでマップイベント内にスクリプトを書く手法で説明してきました。
ですが間違っても**「それなら、すべてスクリプトで書こう」と思ってはいけません。**
見辛さや書き辛さなどももちろんですが、スクリプトには途中でウェイトを挟んでも停止してくれないという仕様があります。
(というかウェイトの仕様が「コマンドとコマンドの間で待つ」なので一つの大きな「スクリプト」イベントコマンドの途中で止まってくれないのです。)
スクリプトを使うのは**「プロパティへの値の読み書き」または「イベントコマンドでは実現できない処理を書く」**ときのみに限定することをおすすめします。
##プロパティの初期化タイミング
プロパティはそのマップを離れるとすべて初期化されて値が消えます。初期化されたくない場合は…やはりツクール変数に代入しておきましょう。
なお、セーブしてロードするだけなら「マップを離れた」わけではないのでプロパティは初期化されません。
#まとめ
以上で単純ですがツクールのオブジェクト指向化、およびプロパティの話を説明してみました。
ひょっとしたら、こんなちょっとしたことをするためにわざわざJavaScriptを使うのはメリットが少ない、と感じるかもしれません。
ですがこのプロパティと次回にお話しする「プレハブ」という手法を組み合わせると
爆発的にゲーム作りが楽になるので、そこでぜひ存分に感動していただきたい!