From 27f1dc71c0572da7655f9e453f5f9a4c513a3b56 Mon Sep 17 00:00:00 2001 From: binarycat Date: Sat, 12 Mar 2022 11:12:29 -0500 Subject: [PATCH] added Rect class --- code/collision.lua | 4 +++ code/rect.lua | 66 ++++++++++++++++++++++++++++++++++++++++++++++ code/require.lua | 1 + 3 files changed, 71 insertions(+) create mode 100644 code/rect.lua diff --git a/code/collision.lua b/code/collision.lua index 1acae56..43d68ef 100644 --- a/code/collision.lua +++ b/code/collision.lua @@ -88,3 +88,7 @@ function Collision:draw(color) love.graphics.setColor(0,1,90,0.5) love.graphics.rectangle("line",self.from.x-Camera.pos.x, self.from.y-Camera.pos.y, self.width, self.height) end + +function Collision:asRect() + return Rect:fromCoords(self.from.x, self.from.y, self.to.x, self.to.y) +end diff --git a/code/rect.lua b/code/rect.lua new file mode 100644 index 0000000..c67c9a6 --- /dev/null +++ b/code/rect.lua @@ -0,0 +1,66 @@ +-- based of of plan9's Rectangle struct +-- rect.max is not counted as "in" the rectangle +Rect = {} +Rect.__index = Rect + +function Rect:fromPoints(pt1, pt2) + local o = { min = pt1, max = pt2 } + setmetatable(o, self) +end + +function Rect:fromCoords(x1, y1, x2, y2) + return Rect:fromPoints(Point:new(x1, y1), Point:new(x2, y2)) +end + +-- clone refers to a deep copy +function Rect:clone() + return Rect:fromCoods(self.min.x, self.min.y, self.max.x, self.max.y) +end + +-- make sure min and max refer to the correct corners +-- acts in place, returns self +function Rect:fix() + if self.min.x > self.max.x then + self.min.x, self.max.x = self.max.x, self.min.x + end + if self.min.y > self.max.y then + self.min.y, self.max.y = self.max.y, self.min.y + end +end + +function Rect:width() + return self.max.x - self.min.x +end + +function Rect:height() + return self.max.y - self.min.y +end + +function Rect:size() + return Point:new(self:width(), self:height()) +end + +function Rect:__add(pt) + return Rect:fromPoints(self.min + pt, self.max + pt) +end + +function Rect:corners() + return { + self.min:copy(), -- top left + Point:new(self.max.x, self.min.y), -- top right + Point:new(self.min.x, self.max.y), -- bottom left + self.max:copy(), -- bottom right + } +end + +function Rect:containsPoint(pt) + return self.min.x < pt.x and + self.min.y < pt.y and + pt.x < self.max.x and + pt.y < self.max.y +end + +function Rect:overlapsRect(other) + return self.min.x