サイログ。

~雑多な記事置き場~

IronRubyでXNAを試してみた

前々から気になっていた、.NETで動くRubyことIronRuby。去年、リポジトリGitHubに移してから触っていなかったのですが、「XNA動くかなぁ・・・」との衝動に駆られて最新のソース引っ張ってきて試してみました。

色々悩みましたが、無事起動に成功しました。

やり方は以下の通り。

ちなみに、使用した環境は以下の通り。

  • VisualStudio 2008 Standard(ProでもExpressでも可・・・のはず)
  • XNA STUDIO 3.0
  • IronRuby 0.4.0(IronRubyの最新版ならなんでも)

以下、動作に使用したスクリプトです。

require 'mscorlib'
# .NET Frameworkは2.0を使用
require 'System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
# XNAは3.0を使用
require 'Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d'
require 'Microsoft.Xna.Framework.Game, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d'

module XNAGameSample
  class Game1 < Microsoft::Xna::Framework::Game
    def initialize
      @graphics = Microsoft::Xna::Framework::GraphicsDeviceManager.new(self)
      @spritePosition = Microsoft::Xna::Framework::Vector2.Zero
      @spriteBatch = nil
      @myTexture = nil
    end

    def load_content
      @spriteBatch = Microsoft::Xna::Framework::Graphics::SpriteBatch.new(self.graphics_device)
      # Content.Loadメソッドは何故かエラーが出たため、Texture2D.FromFileを使用
      @myTexture = Microsoft::Xna::Framework::Graphics::Texture2D.from_file(self.graphics_device, "miku.jpg")
    end

    def unload_content
    end
    
    def update(gameTime)
    end
    
    def draw(gameTime)
      self.graphics_device.clear(Microsoft::Xna::Framework::Graphics::Color.white)
      @spriteBatch.begin
      @spriteBatch.draw(@myTexture, @spritePosition, Microsoft::Xna::Framework::Graphics::Color.white)
      @spriteBatch.end
    end
  end
end

@game = XNAGameSample::Game1.new
@game.Run

このスクリプトは、VS2008上でXNAのウィザードを起動したときのソースをRubyで動くように修正して手を加えたものです。
使用する.NET Frameworkは2.0、XNA Studioは3.0を指定しています。

このスクリプトを保存して(仮に"xna.rb"します)、xna.rbと同じディレクトリにmiku.jpg(クリプトンのサイトから引っ張ってきたもの)を置いて、IronRubyのパスが通っているコマンドプロンプトで以下のコマンドを入力します。

ir xna.rb

さて、これが動くかな・・・。

無事、ミクが姿を現しました。ばんざーい。

いやぁ、前々から、動くはず動くはずと思っていたけど、実際に動かしてないからモヤモヤしていましたが、これで一気に解消されました。やっほーい。やっぱIronRubyは期待大だわ。

これで、XNAが動作すると言うことが分かったので、Rubyで3Dゲームを作れる垣根が低く・・・なればいいなァ(笑)
(・・・っていうことは、IronPythonでも動くのかなぁ。やってみてPythonな人)