Jewel-mmo開発日記

RubyでMMORPGを作る過程を記録する日記。 Yokohama.rb 発起人。
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 で捕らえたくないんだけどどう実装すればいいのだろう。