2006-04-09
イベント処理をラップ
この Ruby/SDL のイベント処理。どうラップするのがいいか。
loop do while event = SDL::Event2.poll case event when SDL::Event2::Quit exit when SDL::Event2::KeyDown puts 'A' if event.sym == SDL::Key::A end end end
こんなのはどうだろうか。
def event_quit(event) exit end def event_key_down(event) puts 'A' if event.sym == SDL::Key::A end game_init screen = Screen.new(SCREEN_W, SCREEN_H) game_loop do # ループ内の処理 end
ためしに実装。
def event_quit(event) exit end def event_keydown(event) puts 'A' if event.sym == SDL::Key::A puts 'SPACE' if event.sym == SDL::Key::SPACE end def event_mousemotion(event) p event.x p event.y end require 'sdl' SDL.init SDL::INIT_VIDEO screen = SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE) loop do while event = SDL::Event2.poll name = "event_#{ event.class.to_s.match(/\w+\z/)[0].downcase }" begin __send__ name, event rescue NoMethodError puts "undefined method `#{ name }'" end end end
文字列 "KeyDown" を "key_down" に変換するいい方法ないかな。
疑問点がひとつ。
def event_keydown(event) aaa() end
とすると、
rescue NoMethodError
につかまる。
しかし、 aaa() の () をとるとと NameError が発生。
def event_keydown(event) aaa end test.rb:6:in `event_keydown': undefined local variable or method `aaa' for main: Object (NameError) from test.rb:23 from test.rb:19
ん、そうかこれはこれでいいか。
けど、
def event_keydown(event) aaa() end
の場合の NoMethodError はここの rescue で捕らえたくないんだけどどう実装すればいいのだろう。