汎用性の高いRGSS。しかし下手にいじると収集がつかなくなってしまうこともあります。
ここでは、RGSSを新規に組上げる(もしくは改造する)際に、 どのような構成でRPGツクールのシステムと融合させて行けば良いかを考察しました。
RPGツクールでのRPG製作において、基本的にRGSSはデフォルトの開発システムでは不可能な(もしくは効率が悪い) オリジナル要素を追加する時に使用するものと思っています(例:戦闘システムの自作、画面切り替え方法の変更など)。
このことから、デフォルトのエディタでできることはデフォルトで行い、 効率が悪かったりどうしても無理な部分をRGSSで作るというのがベターだと考えます。 さらに、デフォルトで組上げてあるRGSSをうまく活かして、追加機能を盛り込んでいく(追加定義)が推奨されています。 自作システムだからといって、まずデフォルトのシステムを全部消して……とやるよりは、 自分で組込みたい部分を追加で上書きしていく形態のほうが構造上もスマートになります。
仮に、メッセージ文章の表示速度をプレイヤー側で変更できるシステムを作りたいとします。
イベントコマンドの文章内で制御文字¥
をたくさん入れて分岐させるわけにもいかないので、
通常はRGSSを使用することになります。
文字表示速度の変更部分ができたとして、どのスピードにするか?という変数を設けておかねばなりません。
ここで、たとえば$system_message_spd
などといったグローバル変数を新たに定義したとします。
一応これでも動作しますが、メッセージスピードはプレイヤーが好みで設定するものなので、
セーブファイルごとに別々に管理する必要があります。このとき、
$system_message_spd
はセーブデータに保存されない値のため、
わざわざセーブ時にファイルに書き込む項目を追加する必要があります。
さらに、$system_message_spd
がどういう値になっているかをゲーム中に見るためには、
イベントコマンドからスクリプトを打つ必要もあります。
ここでは、ゲーム変数$game_variables[変数番号]
の一つをメッセージスピード用に使うのが賢い選択です。
使うゲーム変数にはあらかじめ「RGSS用メッセージスピード」などの名前をつけておき、
ゲーム内で使いまわしされないようにしておきます。RGSS側では$game_variables[変数番号]
を呼び出して、
文章表示速度を管理します。ゲーム変数はセーブファイルに保存されるので、わざわざセーブ側の処理を追加する必要もありません。
テストプレイ時はF9で値を確認可能で、イベントで文章表示速度を変えたければイベントコマンド「変数の操作」で可能です。
また、ゲーム変数にはRGSS側から文字列だけでなく配列も代入可能なので、例えばゲーム内で使用するフォント名や、
技の熟練度(スキルIDをkeyとするハッシュ)などといったものにも使用できます(ただしF9の閲覧時にエラーが出る可能性があります)。
実際にグローバル変数$**を使うことは稀で、スクリプトの構造上同じ名前のグローバル変数を間違って作ってしまい
トラブルのもとになったりするので、今回のようなセーブファイルごとに保存しておきたい値は、
ゲーム変数$game_variables[変数番号]
を使用していくのが無難かと思います。
イベントコマンドには「スクリプト」というものがあり、イベントからもスクリプトを呼び出すことができます。 しかし、イベント側からここに何十行というスクリプトを書くのはあまりよろしくありません。 コピーするにもイベントを探しに行く必要が生じ、スクリプトエディタの検索でもひっかからなくなります。
結局、頻繁には使わないけれども特定の場所で呼び出される機能(例:ある場所でHPを画面に表示する) にスクリプトは使うことになります。これはほぼ''コモンイベント''と同義であるので、デバッグの面からも、 コモンイベントに「スクリプト」コマンドを配置し、イベントからはコモンイベントを呼び出す形が良いかと思われます。
また、イベントコマンド「スクリプト」の処理を行う部分は、RGSSのclass Game_Interpreter
になります。
Game_Interpreter
内で定義されたメソッドは、スクリプトとしてcommand_354
(タイトルへ戻る)
などと一発記述で実行できます。イベント(コモンイベント)から呼び出すスクリプトを作成する際は、
まずclass Game_Interpreter
にメソッドを追加し、それをイベントコマンド「スクリプト」から呼び出すのが良いかと思います。
特に、RPGツクールVXではメソッドが細かく切り分けられています。RGSSに手を加える際は、 クラスを全部書き換えるよりも、改造したい部分のメソッドを追加定義したほうが間違いも少なく、 構造もわかりやすくなります。
例えばウィンドウのカーソル点滅が早すぎるときは、class Window_Base < Window
を全て書き換える必要はなく、
def update
のみ以下のように書き換えるとできます。
class Window_Base < Window #-------------------------------------------------------------------------- # ● フレーム更新 # カーソル早すぎるので2回に1回更新とする # INPUTには影響しない #-------------------------------------------------------------------------- def update super if (Graphics.frame_count % 2 == 0) if @opening self.openness += 48 @opening = false if self.openness == 255 elsif @closing self.openness -= 48 @closing = false if self.openness == 0 end end end#of class
↑これをスクリプト素材として追加することで、class Window_Base
のdef update
だけが上書きされる。
リンク自由
Copyright (c) 2009 - 2010 kazamitori/A-9 & TAMARIBA Members All Rights Reserved.