ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

Rubyのゲームライブラリを試す(後編)

前編に引き続き、Rubyで使えるゲームライブラリを見ていきます

これのうち、後半の2つが今回です

StarRuby

実は、評価した順で言うと、DXRubyの後にStarRubyでした
しかもコンセプトが非常によく似ており、
結果的に最後までどちらにするか悩みました


ちなみに、こちらはSDLのwrapperで、
DXRubyはDirectX依存というあたりが異なります

利点
  • わりと簡潔

クラスやモジュールがぱっと見た感じ整理されて厳選されており、
少ないわりに必要十分な感じがします

  • ドキュメントが親切

チュートリアルからAPIまで、必要な要素が揃っているので、
すぐに動くコードが書けます
DXRubyで書いたサンプルコードを移植するのも簡単でした
(インターフェースが似てるのもあるのですが・・・)

欠点
  • DXRubyに比べて冗長

完全に比較したときの問題なのですが、DXRubyの方が抽象度が高く、
結果的にコード量が少ない感じがします


これはもう本当に比較したらって話なのですが・・・

# StarRuby
Game.run(640, 480, :fps => 60) do |game|
  game.screen.clear # 画面クリア
  game.screen.render_texture(......) # 描画
end

# DXRuby
Window.loop do
  Window.draw(.....) # 描画
end

・・・これのどっちが簡潔か、って話でして、
私の好みは後者だった、というだけです
(画面のクリアとかはブロックの外でやってもらった方が・・・とか)

DXRuby

ここまでは全てSDLのwrapperでしたが、
このライブラリはDirectXのwrapperです

利点
  • 処理が簡潔に書ける
  • できることが必要十分かつ簡潔
  • チュートリアルとサンプルがわかりやすい

この辺のコンセプトはStarRubyと非常によく似てます


ただ、こちらはメソッドの呼び出しが直感的でわかりやすいのです
「オブジェクトクラスのクラスメソッド」って形式なので、
見ただけで何がやりたいのかわかります


どのくらい簡単かというと、さっきも書きましたが・・・

Window.loop do

end

・・・たったこれだけで、DirectXで制御された、
fps60で640x480のウィンドウが完成するのですΣ(・ω・ノ)ノ


さらに、キー入力もこんな感じで

Window.loop do
  break if Input.keyPush?(K_ESCAPE)
end

これだけでも何が実行されるか、だいたいわかりますよね


そもそも、Rubyという言語自体、
いかにして簡潔に書くかに特化されているところがあり、
その意味で実に「Rubyらしい」構造で書けると思います

  • ボタンを「押した時」と「押しっぱなし」を区別できる

StarRubyの場合、基本的に「押しっぱなし」状態になるのですが、
DXRubyだと入力一つだけ取り出すメソッドと、
連続的に取り出すメソッドが分かれているのです
(Input.keyPush? と Input.keyDown?)


今回のダンジョンは別に連続入力を求めておらず、
メソッドだけで切り替えできるこの仕組みは便利です


最初はそんなものかな・・・と思ったのですが、
StarRubyを扱った後だと、ああこっちがいいな・・・と

欠点
  • Windowsでしか動かない

あくまでDirectXのwrapperですので、Windows限定です
まあ、Wineあたりを使えば動く気もしますが

  • デフォルトのDirectXでは動かない

(10/5追記)
下記のFAQによると、スタティックリンク版であればDirectXのインストールは不要な模様
DXRuby プロジェクトWiki - FAQ



最近のWindowsだと、最初からDirectXが入っていることはよく知られていますが、
実は同じ「DirectX9」でも、かなりのアップデートが存在します


たいていのものはデフォルト構成で動くのですが、
ゲームによっては追加ランタイムが要求される場合があります
(最近私が見た例だと、「グランディアオンライン」とか)

DirectX エンド ユーザー ランタイム Web インストーラ
http://www.microsoft.com/downloads/details.aspx?familyid=2da43d38-db71-4c1b-bc6a-9b6652cd92a3&displaylang=ja


DXRubyもこの拡張ランタイムを要求するため、
ただ配布すれば動くとはならないわけです
プレイヤーにある程度の手間を強いることになり、これがマイナスです


(どうやらこのランタイムは「Managed DirectX」とか言うらしく、
 .netからDirectXを叩くのに使われるようです)



というわけで長々書いてきましたが、
最終的に、利点が欠点を大幅に上回ったDXRubyで決めました(`・ω・´) b


後はゲームを作るだけ・・・とはいかず、
もう一点、考えないといけないことがあります


次回はそのあたりのお話を