SDLが使えるようになりました.
不完全ですが、yarv2llvmからRuby/SDLを介してSDLが使えるようになりました。こんな手順で使えます。
- Ruby/SDLをインストールしてください(http://www.kmc.gr.jp/~ohai/rubysdl.html)
- yarv2llvmについては、ここのもの(SDLブランチ)を使ってください(http://github.com/miura1729/yarv2llvm/tree/sdl)
- ruby yarv2llvm.rb -r y2llib/sdl.rb プログラム名と、-rオプションをつけて起動してください
Ruby/SDLに添付されているサンプルを動かそうとするとほとんど動きません.少なくともrequire 'sdl'はコンパイルエラーになるので、削除してください。Ruby/SDLはy2llib/sdl.rbで読み込んでいます.
取り合えず、sampleディレクトリに
- sdltest.rb
- testsplite.rb
の2つのプログラム(Ruby/SDLのサンプルを改造したもの)を添付しました.ご自由にお使いくださいと書いてあったので勝手に改変して添付しましたが、まずかったら教えてくださるとありがたいです.
y2llib/sdl.rbはこんな感じの定義です。
require 'yarv2llvm' require 'sdl' module YARV2LLVM MethodDefinition::RubyMethod[:open][:"SDL:Screen"] = { :argtype => [RubyType.fixnum, RubyType.fixnum, RubyType.fixnum, RubyType.fixnum], :rettype => RubyType.value(nil, "Return type of Screen#open", ::SDL::Screen), } MethodDefinition::RubyMethod[:load_bmp][:"SDL:Surfece"] = { :argtype => [RubyType.string], :rettype => RubyType.value(nil, "Return type of Screen#open", ::SDL::Surface), } MethodDefinition::RubyMethod[:poll][:"SDL:Event2"] = { :argtype => [RubyType.string], :rettype => RubyType.value(nil, "Return type of Event2#poll", ::SDL::Event2), } end <<-EOS nil EOS
結局、SDLのメソッドがどんなオブジェクトを返すか教えているわけです.これだけで拡張ライブラリが実行できてしまえるのはかなり驚いています.
追記
まったく同じプログラムがCRubyでも動くので比べてみたのですが、ほとんど変わりませんでした.もっと絵を生成するのに重たい計算をさせないとGPUやOSばっかりが苦労する状態なのかなとおもいます.
これでゲームが作れそうです.かねがね作りたかったスノーボードゲームが作れないかなーと考えています。山をパーリンノイズで作ってごにょごにょって感じで。