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 で捕らえたくないんだけどどう実装すればいいのだろう。