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

84 lines
1.9 KiB

3 years ago
#!/usr/bin/ruby -w
require "gosu"
load "physobj.rb"
class Window < Gosu::Window
3 years ago
attr_accessor :freeze, :caption, :physobjs, :planets
3 years ago
attr_reader :width, :height
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, Gosu::default_font_name, 12)
3 years ago
@font2 = Gosu::Font.new(self, Gosu::default_font_name, 18)
3 years ago
@freeze = false
3 years ago
end
3 years ago
def button_up(id)
super id
if( id == Gosu::KbEscape ) then
@freeze = !@freeze
3 years ago
end
3 years ago
end
3 years ago
3 years ago
def update
if( !@freeze ) then
@physobjs.each do |obj|
obj.physics
end
@planets.each do |planet|
planet.orbit(@physobjs)
end
3 years ago
end
3 years ago
end
3 years ago
private def generate_debug_string(obj)
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"
end
3 years ago
def draw
3 years ago
status_text = @freeze ? "FROZEN (Escape to unfreeze)" : "(Escape to freeze)"
@font2.draw(status_text, 0, 0, 1, 1.0, 1.0, Gosu::Color::WHITE)
3 years ago
3 years ago
@physobjs.each do |obj|
obj.render
3 years ago
obj.draw_vector(obj.vel, 10)
obj.draw_vector(obj.accel, 500, 0xff_aaffaa)
3 years ago
obj.render_path
3 years ago
@font.draw(self.generate_debug_string(obj), obj.pos[0], obj.pos[1], 1, 1.0, 1.0, Gosu::Color.argb(0xee_aaaaff))
3 years ago
end
3 years ago
@planets.each do |planet|
planet.render
end
3 years ago
end
end
window = Window.new("Physics!", 1600, 900)
3 years ago
planet = Planet.new("Sol", window, 0xff_ffffaa, 1e2, 20, 120)
3 years ago
planet.pos = Vector[800, 450]
3 years ago
3 years ago
cube = PhysCube.new("Cube", window, 8, 8)
3 years ago
cube.pos = Vector[800, 450 + 200]
cube.vel = Vector[2.5, 0]
3 years ago
cube2 = PhysCube.new("Cube2", window, 8, 8)
3 years ago
cube2.pos = Vector[800, 450 - 200]
cube2.vel = Vector[-2.5, 0]
3 years ago
planet.orbit([cube, cube2])
3 years ago
3 years ago
window.planets << planet
3 years ago
window.physobjs << cube
3 years ago
window.physobjs << cube2
3 years ago
window.show