Separate logic into class files

This commit is contained in:
Quinn
2021-12-26 20:57:41 -08:00
parent b6116b67fb
commit a66ea9feee
5 changed files with 178 additions and 172 deletions
-109
View File
@@ -54,115 +54,6 @@ function handle_collisions()
end
end
vec2 = {
x = 0,
y = 0,
mag = function(self)
return sqrt(self.x^2+self.y^2)
end,
dot = function(self,v)
return self.x * v.x + self.y * v.y
end,
normal = function(self)
local mag = self:mag()
return vec2:new(self.x/mag, self.y/mag)
end,
bounce = function(self, n, b)
local b = b or 1
local n = n:normal()
return (n * -2 * self:dot(n) + self) * b
end
}
vec2.__eq = function(v1,v2) return v1.x == v2.x and v1.y == v2.y end
vec2.__add = function(v1,v2) return vec2:new(v1.x+v2.x,v1.y+v2.y) end
vec2.__sub = function(v1,v2) return vec2:new(v1.x-v2.x,v1.y-v2.y) end
vec2.__mul = function(v,s) return vec2:new(v.x*s,v.y*s) end
vec2.__div = function(v,s) return vec2:new(v.x/s,v.y/s) end
vec2.__unm = function(v) return vec2:new(-v.x,-v.y) end
vec2.__tostring = function(v) return "{x: "..v.x..",y: "..v.y.."}" end
vec2.__index = vec2
function vec2:new(x,y)
local x = x or 0
local y = y or 0
local o = {x=x,y=y}
setmetatable(o, self)
o.__index = self
return o
end
function vec2:print_debug(v)
local v = v or vec2:new(0,1)
print("vec: "..vec2.__tostring(self))
print("mag: "..self:mag())
print("dot: "..self:dot(v))
print("normal: "..vec2.__tostring(self:normal()))
print("bounce: "..vec2.__tostring(self:bounce(v)))
print("inv: "..vec2.__tostring(-self))
end
ball = {
__count = 0,
id = nil,
pos = vec2:new(0,0),
vel = vec2:new(0,0),
rad = ball_radius,
col = 7,
draw = function(self)
circfill(self.pos.x, self.pos.y, self.rad, self.col)
end,
move = function(self)
self.pos += self.vel
end,
edge_bounce = function(self)
edge_normal = vec2:new()
for axis in all({"x","y"}) do
val = self.pos[axis]
if (val - self.rad < 0) then
self.pos[axis] = self.rad
edge_normal[axis] = 1
elseif (val + self.rad > 127) then
self.pos[axis] = 127 - self.rad
edge_normal[axis] = -1
end
end
if (edge_normal.x != 0 or edge_normal.y != 0) then
self.vel = self.vel:bounce(edge_normal)
end
end,
check_collisions = function(self, balls)
for b in all(balls) do
if (b.id != self.id and (collisions[b] == nil or collisions[b][self] == nil)) then
local diff = self.pos - b.pos
if ((diff):mag() < self.rad + b.rad) then
collisions[self] = collisions[self] or {}
collisions[self][b] = diff
end
end
end
end,
}
ball.__index = ball
function ball:new(o)
ball.__count += 1
local o = o or {}
o.id = ball.__count
o.col = o.id % 16
setmetatable(o, self)
o.__index = self
return o
end
function collision_vel(x1,v1,x2,v2)
local x_diff = x1 - x2
local v_diff = v1 - v2