require 'RubySFML'
include SFML

TURN = 180
THRUST = 200

class Player < VSprite
	attr_reader :score

	def initialize(image)
		super(image, image.w, image.h)
		@sb = SoundBuffer.new("media/Beep.wav")
		@beep = Sound.new(@sb)
		@score = 0
	end

	def warp(x, y)
		self.x = x
		self.y = y
	end

	def turn_left(time) super(TURN*time); end
  	def turn_right(time) super(TURN*time); end
	def accelerate(time) super(upVector, THRUST*time); end
	def update(time)
		super(time)
		self.x %= 640
		self.y %= 480
		scale_speed(1.0 - 0.5*time)
	end

	def collect(stars)
		stars.reject! { |star|
			if distance(star) < 35 then
				@score += 10
				@beep.play
				true
			else
				false
			end
		}
	end
end

class Star < TSprite
	def initialize(image)
		super(image, image.h, image.h)
		self.color = Color.new(rand(255 - 40) + 40, rand(255 - 40) + 40, rand(255 - 40) + 40, 255)
		self.x = rand * 640
		self.y = rand * 480
		self.subRect = IntRect.new(0, 0, image.h, image.h)
		@last_change = $clock.to_f
	end

	def update(time)
		if $clock.to_f - @last_change >= 0.1 # Change every 10th of a second
			@tx = (@tx+1) % 10
			@last_change = $clock.to_f
		end
	end
end

$clock = Clock.new
mode = VideoMode.new(640, 480, 32)
win = RenderWindow.new(mode, "RubySFML Test", Window::Fullscreen)
win.showMouseCursor(false)
win.useVerticalSync(true)
background_image = Image.new("media/Space.png")
player_image = Image.new("media/Starfighter.png")
star_image = Image.new("media/Star.png")

background = Sprite.new(background_image)
player_image.createMaskFromColor(Color.new(255, 0, 255, 255))
player = Player.new(player_image)
player.warp(320, 240)
stars = []
10.times { stars << Star.new(star_image) }

# Simple game loop
done = false
while !done
	while e = win.getEvent()
		done = true if e.type == Event::Closed or
			(e.type == Event::KeyReleased and e.code == Key::Escape) 
	end
	time = win.frameTime
	input = win.input
	player.turn_left(time) if input.isKeyDown(Key::Left)
	player.turn_right(time) if input.isKeyDown(Key::Right)
	player.accelerate(time) if input.isKeyDown(Key::Up)
	player.update(time)
	player.collect(stars)
    stars << Star.new(star_image) if rand(100) < 1 and stars.size < 10
	stars.each {|star| star.update(time) }

	win.draw(background)
	stars.each {|star| win.draw(star) }
	win.draw(player)
	win.draw(Text.new("Score: #{player.score}", "", 20))
	win.display()
end