summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2023-04-24 15:20:36 -0500
committerthe lemons <citrons@mondecitronne.com>2023-04-24 15:20:36 -0500
commit425c5dae3521479a694528dff33d32989662dda7 (patch)
tree5623e58763c41bd6a3c2e86691295751e21326b3
parent0d2f8775b11b604adc0f9adf73c8f6379e075ad5 (diff)
obj:avel_to_accel (broken)
-rw-r--r--main.lua4
-rw-r--r--obj.lua33
-rw-r--r--objects/x.lua27
-rw-r--r--util.lua8
4 files changed, 70 insertions, 2 deletions
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