Rubyistが知りたいかもしれないRGSSの世界

2005.2.9 サイロス誠

はじめに

エンターブレインから発売された「RPG ツクール XP (以降、"ツクール XP") (参考文献 (1) 参照)」には、Ruby を拡張した「Ruby Game Scripting System (略して RGSS)」が搭載されています。これによってゲームのシステムを Ruby スクリプトで構築することが可能になっています。

でも、この RGSS、オープンソースではない、RPG ツクール XP のサイトからダウンロードできる体験版では、閲覧できる RGSS の詳細がほとんど分からない (かろうじて、RGSS が Ruby に似ていると言うことはわかりますが……)、ヘルプも利用できないといった問題で、ツクール XP の製品版を持たずに得られる情報は非常に限られたものとなっています。

そこで、本コラムでは、意外と中身について知られていない RGSS で一体何ができるのか、そこらへんをツラツラと書いてみようと思います。

なるべく分かり易いように記述するつもりですが、至らないところが多数有るかとは思います。そのときはなにぶんご容赦を。

「RGSS」が登場した背景

2004年の7月に、エンターブレインから「RPG ツクール XP」というソフトが発売されました。

「RPG ツクールシリーズ」は 1980 年代から RPG コンストラクションツール (なんと PC-8801 シリーズから! 懐かしい!) として発売されていましたが、この「ツクール XP」では、他のシリーズには無かった大きな特徴として、「RGSS」の搭載が挙げられます。

RGSS って何?

「RGSS」は「Ruby Game Scripting System」の略で、機能を拡張した Ruby を使ってゲームシステムを構築してしまおうというものです。これまでの「RPG ツクール」シリーズでは困難だった「ゲームシステムそのものの改変や追加」を、RGSS を使って実装できるようになりました。

「ツクール XP」では、メイン作業として、マップ作成やイベント編集、敵キャラクター情報作成等ができるのですが、RGSS では、これらの成果物をすべてオブジェクトとして扱うことができます。 たとえば、プロジェクトを新規作成すると、デフォルトでの状態の RGSS スクリプトを「ツクール XP」内蔵のスクリプトエディタを使用して確認できますが、そこでマップのスクロールや戦闘時のダメージ計算も RGSS で行っていることが確認できます。

ということは、そこに書かれてあるスクリプトを改変して、思い通りのシステムに修正できるということになります。これはウレシイですねぇ。また、グラフィックやサウンドなどの煩雑な手続きを踏む必要がある箇所は、RGSS 内部で処理してくれて、しかも比較的容易に記述できるようにクラス設計がなされていますので、細かいグラフィック処理などを考えることなくロジック記述に専念しやすくなるというのは非常にウレシイことです。

また、「今、新しいゲーム考えているんだけど、デフォルトで用意してくれるスクリプトだと無駄が多いなぁ」と思ったら、一から全て書き直すということも可能です。必要最低限の約束事を守れば、自分好みのコーディングでゲームシステムを作成できます。

ということは、やろうと思えば、シューティングやアクションなんかも作れます。RGSS が搭載されていない従来のツクールを使った別ジャンルのゲームを作った、という作品もありますので (たとえば、「ツクール XP」サンプルゲームの「ししむら」はアクション RPG となっています)、購入されている方は参考にしてみるといいでしょう。

これだけ自由度の高いゲーム製作が可能になると分かると、RGSS そのもののシステムに興味が沸かれるかと思います (沸かない? 沸いてくださいよぉ)。次では、その RGSS で何が出来るか、そこらへんを説明したいと思います。

RGSS でできること

さて、RGSS でできることといえば……

  • Ruby でできること

……い、いや、ヲレは正気ですよ。でもこれは凄いことですよ。

最初、RGSS が「Ruby をベースにしたスクリプト言語システム」ということで、「Ruby のサブセットちゃうかなぁ〜」と考えていたのですが、ところがどっこい、実際触ってみると、Ruby で出来ることは大抵出来てしまうではありませんか。また、バッククォートも使えてしまいます……あまり有用ではありませんが (笑)。

また「ツクール XP」のヘルプには RGSS の Ruby 部分の解説もあるのですが、いくつか便利なメソッドの説明が掲載されていません (例:String クラスの split メソッド)。でも、ただ単にヘルプに明記されていないだけで (Ruby というか、スクリプト言語に慣れていない人のための配慮?)、実際は使うことが出来ます。ヘルプにないからと言って、メソッドが使えないことは無いようです。

更に、Ruby から追加されている項目は以下の5点です。

  1. グラフィックの表示・管理 (スプライトの実装、画像データのキャッシュ、画面の更新等)
  2. 音楽の演奏・管理 (音楽の演奏・停止等)
  3. 入力情報の取得 (キーボードやゲームパッド等のボタン押下状態など)
  4. 「RPG ツクール XP」のエディタで作成したデータとのインタフェース (「ツクール XP」側で作ったデータを読み込んでオブジェクトして扱うことが出来る)
  5. Table クラス (C による拡張クラスで、中身は int 型の配列)

  普段は拡張ライブラリを C や C++ でいちいち書かなくても良く、簡単に思い通りのグラフィックを表示できるは非常に気持ちが良いものです。

RGSS では思い通りに行かないこと

先ほどでは、ゲーム作る際にできて嬉しいなぁと思える機能ばかりでしたが、勿論、自由気ままにというわけにはいかないのが辛いところです。たとえば...

  • 外部ライブラリが添付されていない

  Ruby の標準添付ライブラリ (date クラスなど) は RGSS には添付されていません。 しかし、"require" は普通に使えますので、自分で作った外部ライブラリ (全て Ruby で書かれたライブラリなら問題なく) を使うことは可能です。 でも、扱う内容が内容なので、Win32API ライブラリは組み込まれているようです(参考文献(2)参照)。

(バイナリを使った拡張ライブラリについては未確認です……。が、「RPG ツクール XP」の作者によると、これ自体は VisualC++ で作られているということで (参考文献(3)参照)、 VisualC++ で作られた拡張ライブラリは動くのでは……と予感しています。いつかはやってみようと考えているのですが……)

  • フレームレートを要求するゲームには不向き

RGSS では、画面の描画は 20fps (1 秒間に 20 回画面が切り替わる)に固定されています (実際は 40fps にすることもできるが、動作にハイスペックなマシンが要求されるため、使われることが少ないと思われる)。そのため、30fps や 40fps といった高いフレームレートを要求するゲーム (FPS とか) を作るには不向きです (え、さすがに FPS は作れないだろうって? ごもっとも……)。 リアルタイム描画が少ない RPG やアドベンチャーには十分だとは思いますが……

  • フリーの RGSS 開発環境が存在しない

今のところ、RGSS の開発環境が用意されているのは「RPG ツクール XP」のみ。つまり、RGSS を試すためには現状では「RPG ツクール XP」を買わなければ行けないわけです……これはちょっと痛いかも。ちなみに、今現在での Amazon.co.jp での値段は1万円強 (参考文献 (4) 参照)……中々下がらないねぇ……。

今後、RGSS のエディタと実行環境のみをフリーでダウンロードできるようにして、簡単にプログラムを楽んでから本格的に「RPG ツクール XP」で……ということも考えられると思いますが……どうなんやろ?

さて、次からは、実際に RGSS を組みたいのですが、その前に必要な作業が有りますので、その点について説明していきましょう。

RGSS を組む前準備

ここでは、RGSS でスクリプトを組むために必要な前準備を説明していきましょう。

まず、「ツクール XP」を立ち上げて、プロジェクト (このソフトでは、ゲームを「プロジェクト」という単位で管理しています。勿論、RGSS のスクリプトもその一部です) を新規に作成しておきます。

rpgxp_001.png なにはさておき、肝心のスクリプトですが、ツールチップか、メニューの「ツール」−「スクリプトエディタ」を選ぶとスクリプトの編集画面になります。

rpgxp_002.png spacer.gif

画面の右側がスクリプトエディタで、左側がセクションリスト (スクリプト内容の表題) です。   ここまで来たら、早速スクリプトを解析&編集といきたいところですが……。ここでちょっとストップ。   実際ソースを解析してみると分かるのですが、このデフォルト状態では、ゲームの動作や画面まわり、イベントの詳細 (イベントエディタで選べるイベントも、実装は RGSS です!) などがこの RGSS で実装されています。しかも、RGSS は「RPG ツクール XP」で設定したデータに依存しているわけではありませんので、使おうと思ったら使う程度の感覚でゲームを作成することが可能と言うことが分かります。   確かに、デフォルトのスクリプトを修正して、プログラムの動作をチェックする方法もありますが、デフォルトがかなりタイミング取りとかなんとかで複雑になってまして……それらを一つずつ解析するよりかは、最低限の動作原理を理解して、それから解析を始めたほうがより理解が早そうと考えたので、イチからスクリプトを組んでみましょう。   それでは、デフォルトのスクリプトを全部削除してしまいましょう。

削除するときは、セクションごと消していく方法が便利です。セクションごと削除するときは、セクションリストでセクション名をクリックして、DELキーを押すとセクションごと消去できます (ただし、最低限一つのセクションは残るので、最後の一つはスクリプトエディタで全てのスクリプトを消去します)。   完全にスクリプトを消去した状態だと下図のようになります。この状態で一からスクリプトを組んでいきます。

rpgxp_003.png spacer.gif

次の章では、簡単なスクリプトをもとに、RGSS に必要な構造について説明してみましょう。

(注:この章で採用しているスクリーンショットは、全てエンターブレインの「RPGツクールXP」の実行画面を撮ったものです)  

RGSS の基本的な構造

それでは、Main セクションに以下のスクリプトを記述してみます。

   1|class Util
   2|  @@dx = [0, 0, -1, 1, 0]
   3|  @@dy = [0, 1, 0, 0, -1]
   4|  
   5|  def Util.a2d(dir)
   6|    dp = dir >> 1
   7|    [@@dx[dp], @@dy[dp]]
   8|  end
   9|end
  10|
  11|class Spr
  12|  def initialize(name, vp)
  13|    @final = false
  14|    @sp = Sprite.new(vp)
  15|    @sp.bitmap = Bitmap.new(name)
  16|    @sp.x = 0
  17|    @sp.y = 0
  18|    @sp.visible = true
  19|    @stride = 8
  20|  end
  21|  
  22|  def adjustment(n, min, max, size)
  23|    if n < min
  24|      min
  25|    elsif n + size > max
  26|      max - size
  27|    else
  28|      n
  29|    end
  30|  end
  31|  
  32|  def update
  33|    br = @sp.bitmap.rect
  34|    sr = @sp.viewport().rect
  35|
  36|    d = Input.dir4
  37|    dx, dy = Util.a2d(d)
  38|
  39|    @sp.x = adjustment(@sp.x + dx * @stride, sr.x, sr.width, br.width)
  40|    @sp.y = adjustment(@sp.y + dy * @stride, sr.y, sr.height, br.height)
  41|    
  42|    @final = Input.trigger?(Input::B)
  43|  end
  44|  
  45|  def final?
  46|    @final
  47|  end
  48|end
  49|
  50|def_viewport = Viewport.new(0, 0, 640, 480) # 引数は、(左上x座標、左上y座標、幅、高さ)の順
  51|sp = Spr.new("ruby.png", def_viewport)
  52|loop{
  53|  Graphics.update()
  54|  Input.update()
  55|  sp.update()
  56|  if sp.final?()
  57|    break
  58|  end
  59|}

rpgxp_004.png spacer.gif

このスクリプトを実行してみると、「ruby.png」にセーブした画像がキーパッドを押した方向に移動します。また、画面の端っこまで移動するとそこで止まるようになっています。   上記スクリプトの基本的な流れは以下の通りです。これらの処理に対応したスクリプトの行を併記しておきます。  

  1. クラス定義 (1〜48行目)
  2. データ初期化 (50〜51行目)
  3. グラフィックまわりの更新 ( Graphics.update メソッドを呼び出す) (53行目)
  4. 入力まわりの更新 ( Input.update メソッドを呼び出す) (54行目)
  5. ユーザ定義の操作 (ロジック部処理やグラフィック操作、タイミング同期など) (55行目)
  6. (3) へ戻ってあとは繰り返し (なんらかのタイミングでループを抜ける (56〜58行目))

最低限これらの流れを把握しておけば、あとは (5) の部分に専念すれば問題は無いと思います。   プログラム自体はそんなにトリッキーなことはしておりませんので、Rubyist の皆さんならスクリプトを読めば大体の感触は掴めると思います。ので、必要最低限の説明にとどめて、詳しい解説は割愛いたします (笑)。  

14行目の「Sprite」クラス

クラスに関連づけたビットマップオブジェクト (これも Bitmap クラスのインスタンス) をスプライト表示するためのクラスです。x, y プロパティで表示する位置を設定して、visible プロパティで表示の ON/OFF を設定します。表示を行うのは、必ず Sprite クラスを通じて行います。

15行目の「Bitmap」クラス

ビットマップデータを管理するクラスで、画像の取り込みだけではなく、ビットマップの複写、文字の描画なども行えます。ビットマップの大きさは rect プロパティで取得できます。

36行目の「Input.dir4」メソッド

キーパッドの方向ボタンを押しているときは、それに応じた数値を返却します。但し、その値が 2(下), 4(左), 6(右), 8(上) となっていますので、1〜9 行目のような処理を一度噛ませてから移動時の座標を求めています。

50 行目の「Viewport」クラス

スプライトの表示範囲を設定します。たとえば、「RPG ツクール XP」の場合、ゲーム画面の大きさは 640x480 ですので、画面一杯を表示範囲にしたいときは (0, 0, 640, 480) の大きさで Viewport クラスのインスタンスを作成します。また、画面の左上、4 分の 1 を表示範囲にしたければ、(0, 0, 320, 240) の大きさで作成すればその範囲だけでスプライトを表示できますし、右下 4 分の 1 を範囲にするときは (320, 240, 320, 240) でインスタンスを作成すればいいわけです。   (注:この章で採用しているスクリーンショットは、全てエンターブレインの「RPG ツクールXP」の実行画面を撮ったものです)  

まとめ

ここまで、RGSS について簡単に説明致して参りましたが、いかがでしたか?

基本的には、80 年代に沢山出ていた「BASIC で簡単ゲームプログラミング」のようなノリでプログラムを初めて、デフォルトのスクリプトを参考に、次第に機能を拡張していって慣れていけば、有る程度のゲームは作れるのではないかと思います。   また、今回は説明致しませんでしたが、「RPG ツクール XP」本体で設定・登録しておいたデータ (グラフィック・サウンド・各種パラメータ) を RGSS で簡単に呼び出せるようになっていますので、グラフィックデータなどを本体で管理しておけば RGSS 上で面倒なデータ管理に悩まされずに済みますので、ガシガシ使ってみることをお奨めします。   これらの便利な機能を駆使していけば、行く末には、皆があっと驚くゲームを開発できるのは夢ではないと考えています (実際、これらのスクリプトを駆使して、非常に効果的な演出やシステムのゲームも「RPG ツクール XP」のサンプルゲームとして収録されています)。   それでは、この文章が「RGSS」もしくは「RPG ツクール XP」ユーザ数増加の一翼を担えることを願って、本記事を締めたいと思います。

最後に自己紹介なぞ (著者紹介)

京都の南端でプログラムを書いている (でも住んでいるのは大阪) サイロス誠と申します。数年前に Ruby に出会って、そのおもしろさにハマって以来、スクリプト言語で出来ることは大抵 Ruby でこなしています (やや誇張アリ)。

また、ゲーム作成についても興味があり、幾つかゲームコンストラクションツール (勿論、「RPG ツクール」シリーズも含まれています) を試してみたのですが、プリセットの機能を選択して貼り付けるタイプのモノがほとんどでしたので、ゲームシステムを改変できるくらい自由度の高いツールは中々ありませんでした (昔のツールでは金額の単位を「G」以外変更できない等といった制限がありました。どうやって日本風 RPG を作ればいいのか……)。

そんなある日、「RPG ツクール」最新版の「RPG ツクール XP」の発売が発表され、そこに RGSS が搭載されることを知ったわけです。早速購入していろいろ弄ってみたところ、直感的に分かり易い Ruby のゲーム作成環境としても使えることがわかり、それが今回の記事に繋がったわけです。