From 9e96d4735c86e04784c882430e892453ba29ab15 Mon Sep 17 00:00:00 2001 From: "E. Almqvist" Date: Mon, 11 Oct 2021 22:45:01 +0200 Subject: [PATCH] Physobj --- Gemfile | 3 +++ Gemfile.lock | 13 +++++++++++ app.rb | 40 +++++++++++++++++++++++++++++++++ physobj.rb | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100755 app.rb create mode 100644 physobj.rb diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..dc11dbe --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "gosu" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..43de112 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,13 @@ +GEM + remote: https://rubygems.org/ + specs: + gosu (1.2.0) + +PLATFORMS + x86_64-linux + +DEPENDENCIES + gosu + +BUNDLED WITH + 2.2.26 diff --git a/app.rb b/app.rb new file mode 100755 index 0000000..3285280 --- /dev/null +++ b/app.rb @@ -0,0 +1,40 @@ +#!/usr/bin/ruby -w +require "gosu" +load "physobj.rb" + +class Window < Gosu::Window + attr_accessor :caption, :physobjs + attr_reader :width, :height + + def initialize(title, width, height, physobjs = []) + super width, height + @width, @height = width, height + self.caption = "#{title}| #{width}x#{height}" + + @physobjs = physobjs + end + + def update + @physobjs.each do |obj| + obj.physics + end + end + + def draw + @physobjs.each do |obj| + obj.render + end + end +end + + +window = Window.new("Physics!", 1600, 900) + +planet = PhysCube.new(window, 16, 16, 0xff_aaffaa) + +cube = PhysCube.new(window, 8, 8) +cube.accel = Vector[0, 0.1] +cube.vel = Vector[0.01, 0] + +window.physobjs << cube +window.show diff --git a/physobj.rb b/physobj.rb new file mode 100644 index 0000000..2f9369b --- /dev/null +++ b/physobj.rb @@ -0,0 +1,62 @@ +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