2008年 05月26日(Mon) [長年日記]
_ [ruby][プログラム]Ruby/SDLのラッパーMyGameを試してみる
MyGameはRubyで簡単にゲームを作るために作られたRuby/SDLのラッパーだそうだ。
とりあえず使ってみようってことでインストールした後にサンプルページを見ながら遊んでみた。
まずは仮のウィンドウ生成。
require 'mygame/boot'
と書くだけ。これで640×480のウィンドウが生成される。簡単だ。
mygame/bootを使わず、自分でいろいろカスタマイズをしたい時は
require 'mygame' include MyGame init_game 640, 480 loop_game
という感じで書けば良いらしい。……ってあれ? init_gameなんてメソッドはねぇよ!って怒られた。そんな馬鹿な。よく見るとサンプルページには
※情報が古いことがありますのでご注意ください。
って書いてあった。そうか古いのか。
こういう時はリファレンス見るに限る。……って本当にinit_gameが無い。どうやら代わりにcreate_screen呼ぶと良いらしい。
ところでcreate_screenの説明のサンプルではinitが呼ばれていないんだが、initって何時呼ぶんだ? ソース見たらcreate_screen内部でinit呼んでるかどうかチェックして、自動的に呼び出すようになってた。なるほど解決。
さて上で作られてるウィンドウは背景が黒なので白にしてみたい。リファレンス見るとbackground_colorとbackground_color=が定義されていた。というわけで書いてみる。
require 'mygame' include MyGame create_screen 640, 480 background_color = [255, 255, 255] main_loop
あれ? 背景黒のままだ。ソース見てみるか。
ふむ、main_loopの中に
if block_given? screen.fillRect 0, 0, screen.w, screen.h, background_color if background_color yield screen end
ってコードがあった。どうもmain_loopにブロックを与えないとfillRectしてくれないようだ。
しかしそれでも背景が白にならない。何故だろうと思ってリファレンス眺めてたらset_background_colorってメソッドがあった。試しに使ってみるか。
require 'mygame' include MyGame create_screen 640, 480 set_background_color [255, 255, 255] main_loop{}
おお! 白くなった、白くなった。そうするとset_background_colorとbackground_color=って何が違うんだろう? って話になる。中身見てみるか。
- background_color=
def background_color=(color) @@background_color = color end
- set_background_color
def set_background_color(color) self.background_color = color end
一見ただのリネームに見えるが??? むむむ、これはかの有名なクラス変数の落とし穴か。どうやら@@background_colorとbackground_colorメソッドが指しているものが違うよう。ややこしくて良く分かっていないけど。
ま、Rubyではあまりクラス変数使わない方が良いんだろうな。
といったところでとりあえず終了。まあRuby/SDLをそのままいじるよりは楽そうだけどドキュメントが少ないのでリファレンスとソースを交互に見ながらじゃないとなかなか使いこなせないような感触。
background_color = [255, 255, 255] で白くならないのは、ローカル変数の代入となってしまうためです。MyGame.background_color = [255, 255, 255] と書くと意図する結果になると思います。