2007年 01月 23日

ruby/sdl を使って、Ruby から joystick を扱ってみる

require 'sdl'

SDL.init(SDL::INIT_JOYSTICK)

SDL::Joystick.num.times do |i|
	p SDL::Joystick.index_name(i)
end

j = SDL::Joystick.open(0)
p j.num_axes
p j.num_buttons
p j.num_balls
p j.num_hats


prev = nil
loop do
	SDL::Joystick.update_all
	out = ''
	j.num_axes.times do |i|
		out << "%d:%06d " % [i, j.axis(i)]
	end
	j.num_hats.times do |i|
		state = j.hat(i)
		ret = [0, 0] # x, y
		case state
		when  SDL::Joystick::HAT_CENTERED
			ret = [0, 0]
		when  SDL::Joystick::HAT_UP
			ret = [0, 1]
		when  SDL::Joystick::HAT_RIGHT
			ret = [1, 0]
		when  SDL::Joystick::HAT_DOWN
			ret = [0, -1]
		when  SDL::Joystick::HAT_LEFT
			ret = [-1, 0]
		when  SDL::Joystick::HAT_RIGHTUP
			ret = [1, 1]
		when  SDL::Joystick::HAT_RIGHTDOWN
			ret = [1, -1]
		when  SDL::Joystick::HAT_LEFTUP
			ret = [-1, 1]
		when  SDL::Joystick::HAT_LEFTDOWN
			ret = [-1, -1]
		end
		out << ret.inspect
	end
	out << (0..j.num_buttons).select {|i| j.button(i) }.map {|i| i + 1}.inspect
	unless prev == out
		puts out
		prev = out
	end
	sleep 0.1
end

全然こっちのほうが簡単だなぁ。フォースフィードバック使えないのがちょっと寂しいかもしれない。
あと hat の返す値がちょっとめんどい。上のでは PyGame like にしてみた