From 425c5dae3521479a694528dff33d32989662dda7 Mon Sep 17 00:00:00 2001 From: the lemons Date: Mon, 24 Apr 2023 15:20:36 -0500 Subject: obj:avel_to_accel (broken) --- main.lua | 4 ++-- obj.lua | 33 +++++++++++++++++++++++++++++++++ objects/x.lua | 27 +++++++++++++++++++++++++++ util.lua | 8 ++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 objects/x.lua diff --git a/main.lua b/main.lua index add0d92..30446ea 100644 --- a/main.lua +++ b/main.lua @@ -25,8 +25,8 @@ for i = 1, 100 do end obj.new("test", {0, 0}) - -obj.new("heav_object", {100, 0}) +obj.new("x", {0, 60}, {avel = 100}) +obj.new("heav_object_2", {100, 60}) local function window_scale() local w, h = love.graphics.getDimensions() diff --git a/obj.lua b/obj.lua index f93eae9..e8aa32e 100644 --- a/obj.lua +++ b/obj.lua @@ -202,6 +202,39 @@ function obj:energy() return 1 + avel*avel + vx*vx + vy*vy end +function obj:observe_avel(o) + return o.data.avel - self.data.avel +end + +function obj:observe_vel(o) + local vx, vy = unpack(self.data.vel) + local ovx, ovy = unpack(o.data.vel) + return ovx - vx, ovy - vy +end + +function obj:observe_pos(o) + local px, py = unpack(self.data.pos) + local opx, opy = unpack(o.data.pos) + return opx - px, opy - py +end + +function obj:avel_to_accel(o, ax, ay) + local ovx, ovy = self:observe_vel(o) + local nvx, nvy = ovx + ax, ovy + ay + local v = util.magnitude{ovx, ovy} + local nv = util.magnitude{nvx, nvy} + local ne = v*v - nv*nv + local avel = self:observe_avel(o) + local ave = avel*avel + ne + if ave < 0 then + return false + end + local vx, vy = unpack(self.data.vel) + o.data.avel = self.data.avel + (math.sqrt(ave) * (avel >= 0 and 1 or -1)) + o.data.vel = {vx + nvx, vy + nvy} + return true +end + function obj:in_hitbox(px, py) local x, y = unpack(self.data.pos) local dx, dy = x - px, y - py diff --git a/objects/x.lua b/objects/x.lua new file mode 100644 index 0000000..f97d1d4 --- /dev/null +++ b/objects/x.lua @@ -0,0 +1,27 @@ +local obj = require "obj" +local util = require 'util' + +local x_obj = {hitbox = 4} + +function x_obj:draw() + set_color(0.5, 1, 0.8) + line(-4, 2, 0, 0, -2, 4, -4, 2) + line(0, 0, 2, 4, 4, 2, 0, 0) + line(0, 0, 4, -2, 2, -4, 0, 0) + line(0, 0, -2, -4, -4, -2, 0, 0) +end + +local range = 40 +function x_obj:tick() + local x, y = unpack(self.data.pos) + for o in obj.in_circle(x, y, range) do + if o ~= self then + local px, py = self:observe_pos(o) + local mag = util.magnitude{px, py} + local dx, dy = px / mag, py / mag + self:avel_to_accel(o, dx * mag/range, dy * mag/range) + end + end +end + +return {x = x_obj} diff --git a/util.lua b/util.lua index 24b4214..452e6d5 100644 --- a/util.lua +++ b/util.lua @@ -31,4 +31,12 @@ function M.rot(a, x, y) return x*math.cos(a) - y*math.sin(a), x*math.sin(a) + y*math.cos(a) end +function M.magnitude(v) + local s = 0 + for _, a in ipairs(v) do + s = s + a*a + end + return math.sqrt(s) +end + return M -- cgit v1.2.3