76 lines
1.5 KiB
Lua
76 lines
1.5 KiB
Lua
rectgen = {}
|
|
|
|
function rectgen:new(x,y,w,h)
|
|
|
|
Rect = {x,y,w,h}
|
|
|
|
function Rect:move(x,y)
|
|
self[1] = self[1] + x
|
|
self[2] = self[2] + y
|
|
self:reAdapt()
|
|
end
|
|
|
|
function Rect:move_ip(x,y)
|
|
self[1] = x
|
|
self[2] = y
|
|
self:reAdapt()
|
|
end
|
|
|
|
function Rect:setSize(w,h)
|
|
self[3] = w
|
|
self[4] = h
|
|
self:reAdapt()
|
|
end
|
|
|
|
function Rect:move_center(x,y)
|
|
self[1] = x-self.w/2
|
|
self[2] = y-self.h/2
|
|
self:reAdapt()
|
|
end
|
|
|
|
function Rect:reAdapt()
|
|
self.x = self[1]
|
|
self.y = self[2]
|
|
self.w = self[3]
|
|
self.h = self[4]
|
|
self.center = {self.x+self.w/2,self.y+self.h/2}
|
|
self.center.x = self.x+self.w/2
|
|
self.center.y = self.y+self.h/2
|
|
self.up = self.y
|
|
self.left = self.x
|
|
self.right = self.x+self.w
|
|
self.down = self.y+self.h
|
|
end
|
|
|
|
function Rect:colliderect(orect,xoffset,yoffset,semisolid) -- AABB collision check
|
|
local result = true
|
|
local offx = xoffset or 0
|
|
local offy = yoffset or 0
|
|
if self.right+offx <= orect.left or self.left+offx>=orect.right then result = false end
|
|
if self.down+offy <= orect.up or self.up+offy>=orect.down then result = false end
|
|
if semi and result then
|
|
if not self.bottom<orect.top then result = false end
|
|
end
|
|
return result
|
|
end
|
|
|
|
function Rect:collidepoint(x,y)
|
|
return self.x<x and x<self.x+self.w and self.y<y and y<self.y+self.h
|
|
end
|
|
|
|
function Rect:colliderects(recttable,xoffset,yoffset,semisolid)
|
|
local result = {}
|
|
for i,v in pairs(recttable) do
|
|
if self:colliderect(v,xoffset,yoffset,semisolid) then table.insert(result,v) end
|
|
end
|
|
return result
|
|
end
|
|
|
|
Rect:reAdapt()
|
|
|
|
return Rect
|
|
|
|
end
|
|
|
|
return rectgen
|