lovexp/asteroids/phys.lua
2025-11-17 23:15:21 -05:00

36 lines
1 KiB
Lua

local inspect = require('inspect')
local phys = {
tau = 2 * math.pi
}
-- returns true if the two actors intersect
function phys.intersects(actor1, actor2)
return (actor1.x - actor2.x) ^ 2 + (actor1.y - actor2.y) ^ 2 <= (actor1.radius + actor2.radius) ^ 2
end
-- updates the actor's location by applying the passage of time
function phys.update(actor, dt)
assert(actor.speed >= 0)
local dv = actor.speed * dt
actor.x = actor.x + math.cos(actor.angle) * dv
actor.y = actor.y + math.sin(actor.angle) * dv
local dr = actor.spin * dt
actor.facing = (actor.facing + dr) % phys.tau
end
function phys.apply(actor, force)
local ax = math.cos(actor.angle) * actor.speed
local ay = math.sin(actor.angle) * actor.speed
local fx = math.cos(force.angle) * force.speed
local fy = math.sin(force.angle) * force.speed
local x = ax + fx
local y = ay + fy
local speed = math.sqrt(x ^ 2 + y ^ 2)
local angle = math.atan2(y, x)
actor.speed = speed
actor.angle = angle
end
return phys