From c055f9d548e879cffddca6a6e579ac39bc88e7fb Mon Sep 17 00:00:00 2001 From: Hyeonung Baek Date: Thu, 2 Jan 2025 20:55:51 +0900 Subject: [PATCH] add entity module --- entity.lua | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ item.lua | 31 ++++++++++---------------- item/crowbar.lua | 19 ++++++---------- object.lua | 16 ------------- room.lua | 11 ++------- room/default.lua | 5 +---- 6 files changed, 80 insertions(+), 60 deletions(-) create mode 100644 entity.lua delete mode 100644 object.lua diff --git a/entity.lua b/entity.lua new file mode 100644 index 0000000..7f74718 --- /dev/null +++ b/entity.lua @@ -0,0 +1,58 @@ +local window = require('window') + +-- base prototype of all drawn things +local m = { + _t = 'entity', + x = 0, + y = 0, + width = 0, + height = 0, +} + +m.__index = m + +function m:new() + local t = {} + t.__index = t + return setmetatable(t, self) +end + +function m:from(t) + t.__index = t + return setmetatable(t, self) +end + +function m:setpos(x, y) + self.x = x + self.y = y +end + +function m:draw() + love.graphics.push('all') + love.graphics.translate(self.x, self.y) + love.graphics.setLineWidth(3) + + for _, l in ipairs(self.lines) do + local mode = l[1] + local segs = l[2] + + if mode == 'line' then + love.graphics.line(segs) + elseif mode == 'fill' then + local ts = love.math.triangulate(segs) + love.graphics.setColor(0, 0, 0) + for _, t in ipairs(ts) do + love.graphics.polygon('fill', ts) + end + + love.graphics.setColor(1, 1, 1) + love.graphics.polygon('line', segs) + else + error(string.format("mode must be one of line or fill, not %s", mode)) + end + end + + love.graphics.pop() +end + +return m diff --git a/item.lua b/item.lua index 62a0c29..fffdd53 100644 --- a/item.lua +++ b/item.lua @@ -1,36 +1,21 @@ local window = require('window') +local entity = require('entity') -- item prototype -- name -- image -- description -local m = { +local m = entity:from{ _t = 'item', - x = 0, - y = 0, width = 60, height = 60, name = "item", description = "sample description", } -function m:new() - local mt = { __index = m } - local i = {} - setmetatable(i, mt) - return i -end +--[[ Item ]]-- -function m:setpos(x, y) - self.x = x - self.y = y -end - -function m:draw() - love.graphics.draw(self.image, self.x, self, y) -end - -function m:pickupMode(room) +function m:pickupMode() self.mousepressed = window.mousepressed(function (self, x, y, button) self:itemMode() self.room:remove(self) @@ -44,4 +29,12 @@ function m:itemMode() end) end +function m:install(room, x, y) + local i = self:new() + i.room = room + i:pickupMode() + i:setpos(x, y) + room:insert(i) +end + return m diff --git a/item/crowbar.lua b/item/crowbar.lua index a0fe500..827b079 100644 --- a/item/crowbar.lua +++ b/item/crowbar.lua @@ -1,16 +1,11 @@ local item = require('item') -local m = item:new() - -m.name = "Crowbar" -m.description = "A durable tool for opening wooden boxes." - -function m:draw() - love.graphics.push('all') - love.graphics.translate(self.x, self.y) - love.graphics.setLineWidth(3) - love.graphics.line(10, 20, 20, 10, 25, 10, 30, 20, 40, 50) - love.graphics.pop() -end +local m = item:from{ + name = "Crowbar", + description = "A durable tool for opening wooden boxes.", + lines = { + {'line', {10, 20, 20, 10, 25, 10, 30, 20, 40, 50}} +} +} return m diff --git a/object.lua b/object.lua deleted file mode 100644 index 4d16a6c..0000000 --- a/object.lua +++ /dev/null @@ -1,16 +0,0 @@ -local window = require('window') --- prototype of immovable objects - -local m = {} -m.__index = m - -function m:new() - return setmetatable({}, self) -end - -m.mousepressed = window.mousepressed(function (self, x, y, button) - end) - -function m:draw() - love.graphics.draw(self.image, self.x, self.y) -end diff --git a/room.lua b/room.lua index d69c94e..de8cf78 100644 --- a/room.lua +++ b/room.lua @@ -1,10 +1,11 @@ local window = require('window') +local entity = require('entity') -- prototype of room -- - background -- - objects -- - edges -local room = { +local room = entity:from{ x = 0, y = 0, background = love.graphics.newImage("res/defaultbg.png"), edges = {}, @@ -26,14 +27,6 @@ function edge_position(e) return p[1], p[2] end -local mt = { __index = room } - -function room:new() - local m = {} - setmetatable(m, mt) - return m -end - function room:insert(obj) table.insert(self.objects, obj) obj.idx = #self.objects diff --git a/room/default.lua b/room/default.lua index d5cbdf7..b1a5779 100644 --- a/room/default.lua +++ b/room/default.lua @@ -5,9 +5,6 @@ local r = room:new() r.background = love.graphics.newImage("res/defaultbg.png") local crowbar = require('item/crowbar') -crowbar:pickupMode() -crowbar:setpos(100, 160) -crowbar.room = r -r:insert(crowbar) +crowbar:install(r, 100, 160) return r