Hohmann Miner, a sandbox physics game where you mine stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hohmann-miner/app.rb

166 lines
3.5 KiB

3 years ago
#!/usr/bin/ruby -w
3 years ago
require "matrix"
3 years ago
require "gosu"
3 years ago
load "gosu_plugin.rb"
3 years ago
3 years ago
load "ui.rb"
3 years ago
load "config.rb"
3 years ago
load "physobj.rb"
3 years ago
load "objects.rb"
3 years ago
load "controller.rb"
3 years ago
class Window < Gosu::Window
3 years ago
attr_accessor :freeze, :caption, :physobjs, :planets, :controller, :camera, :ui
3 years ago
attr_reader :width, :height, :fonts
3 years ago
3 years ago
def initialize(title, width, height, physobjs = [], planets = [])
3 years ago
super width, height
@width, @height = width, height
self.caption = "#{title}| #{width}x#{height}"
@physobjs = physobjs
3 years ago
@planets = planets
3 years ago
@font = Gosu::Font.new(self, MAIN_FONT, 18)
@font2 = Gosu::Font.new(self, MAIN_FONT, 20)
3 years ago
@font_title = Gosu::Font.new(self, MAIN_FONT, 64)
@font_button = Gosu::Font.new(self, MAIN_FONT, 48)
3 years ago
@fonts = {
normal: @font,
3 years ago
big: @font2,
title: @font_title,
button: @font_button
3 years ago
}
3 years ago
@freeze = true
3 years ago
@controller = nil
3 years ago
3 years ago
@camera = Vector[0, 0]
3 years ago
@ui = []
end
def start_game
cube = Player.new("Alpha", self, 8, 8)
cube.show_info = false
cube.thrust = 0.0075
cube.pos = Vector[800, 450 + 500]
cube.vel = Vector[1, 0]
self.controller = cube
cube2 = PhysCube.new("Beta", self, 8, 8)
cube2.pos = Vector[800, 450 + 300]
cube2.vel = Vector[2, 0]
cube2.show_info = true
sol = Planet.new("Sol", self, 0xff_ffffaa, 1e2, 15, 1)
sol.pos = Vector[800, 450]
planet = Planet.new("Planet", self, 0xff_cccccc, 1e1, 8, 1)
planet.pos = Vector[800, 450 + 300]
planet.vel = Vector[-2, 0]
planet.show_info = true
sol_orbiters = [cube, cube2, planet]
sol.orbit(sol_orbiters)
self.planets << sol
self.planets << planet
self.planets << cube
self.physobjs << cube
self.physobjs << cube2
self.physobjs << planet
3 years ago
end
3 years ago
def button_up(id)
super id
3 years ago
if( @controller != nil && @controller.class == Player ) then
3 years ago
@controller.button_up(id)
end
3 years ago
end
3 years ago
3 years ago
def button_down(id)
super id
3 years ago
if( id == BIND_PAUSE ) then
3 years ago
@freeze = !@freeze
end
3 years ago
if( @controller != nil && @controller.class == Player ) then
3 years ago
@controller.button_down(id)
end
end
3 years ago
def button_up?(id)
super id
if( @controller != nil && @controller.class == Player ) then
@controller.button_up?(id)
end
end
def button_down?(id)
super id
if( @controller != nil && @controller.class == Player ) then
@controller.button_down?(id)
end
end
3 years ago
3 years ago
def update
3 years ago
if( !@freeze ) then
@physobjs.each do |obj|
obj.physics
end
@planets.each do |planet|
orbiters = []
orbiters += @physobjs
orbiters += @planets
orbiters.delete(planet)
planet.orbit(planets)
end
3 years ago
end
3 years ago
end
3 years ago
private def generate_debug_string(obj)
3 years ago
return "\n#{obj.name}\nVel: #{obj.vel.round(4)} (#{obj.vel.magnitude.round(1)})\nAccel: #{obj.accel.round(4)} (#{obj.accel.magnitude.round(4)})\nPos: #{obj.pos.round(4)}\n"
3 years ago
end
3 years ago
def draw
3 years ago
@ui.each do |u|
u.render
end
3 years ago
if( @controller != nil ) then
3 years ago
@camera = Vector[self.width/2, self.height/2] - @controller.pos
3 years ago
@font.draw_text(@controller.debug_string, 0, 32, 1, 1.0, 1.0, Gosu::Color::WHITE)
3 years ago
end
camx, camy = @camera[0], @camera[1]
@font2.draw_text("Frozen: #{@freeze}", 0, 0, 1, 1.0, 1.0, Gosu::Color::WHITE)
3 years ago
3 years ago
@physobjs.each do |obj|
3 years ago
obj.render(camx, camy)
3 years ago
obj.draw_vector(obj.vel, 10, 0xff_ffaaaaa, camx, camy)
obj.draw_vector(obj.accel, 500, 0xff_aaffaa, camx, camy)
obj.render_path(camx, camy)
obj.draw_direction(camx, camy)
3 years ago
end
3 years ago
@planets.each do |planet|
3 years ago
planet.render(camx, camy)
3 years ago
end
3 years ago
end
end
3 years ago
window = Window.new("Hohmann Miner", WINDOW_WIDTH, WINDOW_HEIGHT)
window.fullscreen = WINDOW_FULLSCREEN
3 years ago
3 years ago
mainmenu = MainMenu.new(window, true)
3 years ago
3 years ago
window.show