class IMICFPS class Game < GameState include OpenGL include GLU def setup @renderer = Renderer.new(game_state: self) @terrain = Terrain.new(game_state: self)#(size: 170, height: 0) @draw_skydome = true @skydome = Skydome.new(scale: 0.08, backface_culling: false, auto_manage: false) 25.times do Tree.new(x: rand(@terrain.width)-(@terrain.width/2.0), z: rand(@terrain.depth)-(@terrain.depth/2.0), terrain: @terrain, game_state: self) end @player = Player.new(x: 1, y: 0, z: -1, terrain: @terrain, game_state: self) @camera = Camera.new(x: 0, y: -2, z: 1) @camera.attach_to(@player) @crosshair_size = 10 @crosshair_thickness = 3 @crosshair_color = Gosu::Color.rgb(255,127,0) # @font = Gosu::Font.new(18, name: "DejaVu Sans") @text = MultiLineText.new("Pending...", x: 10, y: 10, z: 1, size: 18, font: "DejaVu Sans") Light.new(x: 3, y: -6, z: 6, game_state: self) Light.new(x: 0, y: 100, z: 0, diffuse: Color.new(1.0, 0.5, 0.1), game_state: self) end def glError? e = glGetError() if e != GL_NO_ERROR $stderr.puts "OpenGL error in: #{gluErrorString(e)} (#{e})\n" exit end end def draw glError? gl do glError? glClearColor(0,0.2,0.5,1) # skyish blue glError? glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # clear the screen and the depth buffer glError? @lights.each(&:draw) @camera.draw @renderer.opengl_renderer.draw_object(@skydome) if @skydome.renderable glEnable(GL_DEPTH_TEST) @renderer.draw end # Draw crosshair draw_rect($window.width/2-@crosshair_size, ($window.height/2-@crosshair_size)-@crosshair_thickness/2, @crosshair_size*2, @crosshair_thickness, @crosshair_color, 0, :default) draw_rect(($window.width/2)-@crosshair_thickness/2, $window.height/2-(@crosshair_size*2), @crosshair_thickness, @crosshair_size*2, @crosshair_color, 0, :default) @text.draw end def update @last_frame_time = Gosu.milliseconds begin string = <<-eos OpenGL Vendor: #{glGetString(GL_VENDOR)} OpenGL Renderer: #{glGetString(GL_RENDERER)} OpenGL Version: #{glGetString(GL_VERSION)} OpenGL Shader Language Version: #{glGetString(GL_SHADING_LANGUAGE_VERSION)} Camera pitch: #{@camera.pitch.round(2)} Yaw: #{@camera.yaw.round(2)} Roll #{@camera.roll.round(2)} Camera X:#{@camera.x.round(2)} Y:#{@camera.y.round(2)} Z:#{@camera.z.round(2)} Compensating faulty mouse centering? #{@camera.broken_mouse_centering} #{if @camera.game_object then "Actor X:#{@camera.game_object.x.round(2)} Y:#{@camera.game_object.y.round(2)} Z:#{@camera.game_object.z.round(2)}";end} Field Of View: #{@camera.field_of_view} Mouse Sesitivity: #{@camera.mouse_sensitivity} Last Frame: #{delta_time*1000.0}ms (#{Gosu.fps} fps) Vertices: #{formatted_number($window.number_of_vertices)} Faces: #{formatted_number($window.number_of_vertices/3)} Draw Skydome: #{@draw_skydome} Debug mode: #{$debug} eos rescue ArgumentError string = <<-eos Unable to call glGetString! Camera pitch: #{@camera.pitch.round(2)} Yaw: #{@camera.yaw.round(2)} Roll #{@camera.roll.round(2)} Camera X:#{@camera.x.round(2)} Y:#{@camera.y.round(2)} Z:#{@camera.z.round(2)} #{if @camera.game_object then "Actor X:#{@camera.game_object.x.round(2)} Y:#{@camera.game_object.y.round(2)} Z:#{@camera.game_object.z.round(2)}";end} Field Of View: #{@camera.field_of_view} Mouse Sesitivity: #{@camera.mouse_sensitivity} Last Frame: #{delta_time*1000.0}ms (#{Gosu.fps} fps) Vertices: #{formatted_number($window.number_of_vertices)} Faces: #{formatted_number($window.number_of_vertices/3)} Draw Skydome: #{@draw_skydome} Debug mode: #{$debug} eos end @text.text = string # Expensive AABB collision detection @game_objects.each do |object| @game_objects.each do |b| next if object == b next if object.is_a?(Terrain) || b.is_a?(Terrain) if object.intersect(object, b) object.debug_color = Color.new(1.0,0.0,0.0) b.debug_color = Color.new(1.0,0.0,0.0) # ObjectManager.objects.delete(object) unless object.is_a?(Player) # puts "#{object} is intersecting #{b}" if object.is_a?(Player) else object.debug_color = Color.new(0,1,0) b.debug_color = Color.new(0,1,0) end end end @game_objects.each(&:update) @skydome.update if @skydome.renderable @camera.update $window.close if $window.button_down?(Gosu::KbEscape) $window.number_of_vertices = 0 @delta_time = Gosu.milliseconds end def button_up(id) @game_objects.each do |object| object.button_up(id) if defined?(object.button_up) end @camera.button_up(id) case id when Gosu::KbZ @draw_skydome = !@draw_skydome when Gosu::KbBacktick $debug = !$debug end @skydome.renderable = @draw_skydome end def needs_cursor? @needs_cursor end def lose_focus puts 'Bye' end end end