require "matrix" class PhysObj attr_accessor :world, :pos, :vel, :accel, :x, :y def initialize(world) @world = world @pos = Vector.zero(2) @vel = Vector.zero(2) @accel = Vector.zero(2) @x, @y = 0, 0 end def tick if( @accel.magnitude != 0 ) then @vel += @accel end if( @vel.magnitude != 0 ) then @pos += @vel end @x, @y = @pos[0], @pos[1] end end class PhysCube < PhysObj attr_reader :width, :height def initialize(world, width, height, color=0xff_ffffff, ela=-0.8) super world @width, @height = width, height @color = Gosu::Color.argb(color) @ela = ela end def draw_vector(vec, scale=0.1, color=0xaf_ffaaaa) clr = Gosu::Color.argb(color) dx, dy = vec[0], vec[1] xx, yy = @x + @width/2, @y + @height/2 Gosu.draw_line(xx, yy, clr, (xx + dx).round(1) * scale, (yy + dy).round(1) * scale, clr) puts("#{dx} #{dy} #{[xx - (xx + dx), yy - (yy + dy)]}") end def render x, y = self.pos[0], self.pos[1] Gosu.draw_quad(x, y, @color, x + self.width, y, @color, x, y + self.height, @color, x + self.width, y + self.height, @color) self.draw_vector(@accel, 10, 0xff_00ff00) end def physics self.tick x, y = self.pos[0], self.pos[1] x_max = world.width - self.width y_max = world.height - self.height if( x > x_max ) then self.pos[0] = x_max end if( y > y_max ) then self.pos[1] = y_max end end end