|
|
|
#!/usr/bin/ruby -w
|
|
|
|
require "gosu"
|
|
|
|
load "physobj.rb"
|
|
|
|
|
|
|
|
class Window < Gosu::Window
|
|
|
|
attr_accessor :caption, :physobjs, :planets
|
|
|
|
attr_reader :width, :height
|
|
|
|
|
|
|
|
def initialize(title, width, height, physobjs = [], planets = [])
|
|
|
|
super width, height
|
|
|
|
@width, @height = width, height
|
|
|
|
self.caption = "#{title}| #{width}x#{height}"
|
|
|
|
|
|
|
|
@physobjs = physobjs
|
|
|
|
@planets = planets
|
|
|
|
end
|
|
|
|
|
|
|
|
def update
|
|
|
|
@physobjs.each do |obj|
|
|
|
|
obj.physics
|
|
|
|
end
|
|
|
|
|
|
|
|
@planets.each do |planet|
|
|
|
|
planet.orbit(@physobjs)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def draw
|
|
|
|
@physobjs.each do |obj|
|
|
|
|
obj.render
|
|
|
|
obj.draw_vector(obj.vel, 10)
|
|
|
|
obj.draw_vector(obj.accel, 500, 0xff_aaffaa)
|
|
|
|
obj.render_path
|
|
|
|
end
|
|
|
|
|
|
|
|
@planets.each do |planet|
|
|
|
|
planet.render
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
window = Window.new("Physics!", 1600, 900)
|
|
|
|
|
|
|
|
planet = Planet.new("Earth", window, 0xff_aaffaa, 0.0001)
|
|
|
|
planet.pos = Vector[800, 450]
|
|
|
|
|
|
|
|
cube = PhysCube.new("Cube", window, 8, 8)
|
|
|
|
cube.pos = Vector[800, 450 + 100]
|
|
|
|
cube.vel = Vector[4, 0]
|
|
|
|
|
|
|
|
cube2 = PhysCube.new("Cube2", window, 8, 8)
|
|
|
|
cube2.pos = Vector[800, 450 + 500]
|
|
|
|
cube2.vel = Vector[5, 0]
|
|
|
|
planet.orbit([cube, cube2])
|
|
|
|
|
|
|
|
window.planets << planet
|
|
|
|
window.physobjs << cube
|
|
|
|
window.physobjs << cube2
|
|
|
|
window.show
|