2006-04-10
イベント処理をラップ (2)
昨日のイベント処理をメソッドとして定義する案を書いて、すぐにあれでは使いにくいことに気づいた。例えばマウスカーソルの位置にボールを表示する場合。簡単にはマウスの座標をループ内の x, y に伝えられないのだ。
def event_mousemotion(event) event.x # あれ、どうしよう…… event.y end game_init screen = Screen.new(SCREEN_W, SCREEN_H) x, y = 0, 0 game_loop do draw_image screen, 'ball.bmp', x, y end
じゃあ結局ループ内でマウスイベントをポーリングする仕組みのほうがいいか。ループ内に毎回判定を書くの実は好きなんだけど、もっといい方法がありそうだ。
game_loop do
if event_mousemotion?
x = event_mouse_x
y = event_mouse_x
end
draw_image screen, 'ball.bmp', x, y
end
こんな書き方はできないのだろうか。というかこれできるんじゃないの?
x, y = 0, 0
add_event_mousemotion {|event| x, y = event.x, event.y }
game_loop do
draw_image screen, 'ball.bmp', x, y
end
とりあえず簡単な実装。おおうまくいく。ブロックというか proc ってほとんど使ったことなかったけどこうやって使うんだ。なるほど。
def add_event_mousemotion(&block)
$event_blocks << block
end
require 'sdl'
SDL.init SDL::INIT_VIDEO
screen = SDL.setVideoMode(320, 240, 16, SDL::SWSURFACE)
$event_blocks = []
x, y = 0, 0
add_event_mousemotion { puts "MouseMotion" }
add_event_mousemotion {|event| x, y = event.x, event.y }
loop do
while event = SDL::Event2.poll
case event
when SDL::Event2::Quit
exit
when SDL::Event2::MouseMotion
$event_blocks.each {|block| block.call event }
end
end
puts x, y
sleep 1.0 / 60
end
--
いやあ、やっぱりRubyのパワーすごい。今まで Ruby での GUI のゲームはあんまり手を着けてなかったんだけど、 Ruby + Ruby/SDL かなり面白いかも。