add entity module

This commit is contained in:
백현웅 2025-01-02 20:55:51 +09:00
parent a50a6e2734
commit c055f9d548
6 changed files with 80 additions and 60 deletions

58
entity.lua Normal file
View file

@ -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

View file

@ -1,36 +1,21 @@
local window = require('window') local window = require('window')
local entity = require('entity')
-- item prototype -- item prototype
-- name -- name
-- image -- image
-- description -- description
local m = { local m = entity:from{
_t = 'item', _t = 'item',
x = 0,
y = 0,
width = 60, width = 60,
height = 60, height = 60,
name = "item", name = "item",
description = "sample description", description = "sample description",
} }
function m:new() --[[ Item ]]--
local mt = { __index = m }
local i = {}
setmetatable(i, mt)
return i
end
function m:setpos(x, y) function m:pickupMode()
self.x = x
self.y = y
end
function m:draw()
love.graphics.draw(self.image, self.x, self, y)
end
function m:pickupMode(room)
self.mousepressed = window.mousepressed(function (self, x, y, button) self.mousepressed = window.mousepressed(function (self, x, y, button)
self:itemMode() self:itemMode()
self.room:remove(self) self.room:remove(self)
@ -44,4 +29,12 @@ function m:itemMode()
end) end)
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 return m

View file

@ -1,16 +1,11 @@
local item = require('item') local item = require('item')
local m = item:new() local m = item:from{
name = "Crowbar",
m.name = "Crowbar" description = "A durable tool for opening wooden boxes.",
m.description = "A durable tool for opening wooden boxes." lines = {
{'line', {10, 20, 20, 10, 25, 10, 30, 20, 40, 50}}
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
return m return m

View file

@ -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

View file

@ -1,10 +1,11 @@
local window = require('window') local window = require('window')
local entity = require('entity')
-- prototype of room -- prototype of room
-- - background -- - background
-- - objects -- - objects
-- - edges -- - edges
local room = { local room = entity:from{
x = 0, y = 0, x = 0, y = 0,
background = love.graphics.newImage("res/defaultbg.png"), background = love.graphics.newImage("res/defaultbg.png"),
edges = {}, edges = {},
@ -26,14 +27,6 @@ function edge_position(e)
return p[1], p[2] return p[1], p[2]
end end
local mt = { __index = room }
function room:new()
local m = {}
setmetatable(m, mt)
return m
end
function room:insert(obj) function room:insert(obj)
table.insert(self.objects, obj) table.insert(self.objects, obj)
obj.idx = #self.objects obj.idx = #self.objects

View file

@ -5,9 +5,6 @@ local r = room:new()
r.background = love.graphics.newImage("res/defaultbg.png") r.background = love.graphics.newImage("res/defaultbg.png")
local crowbar = require('item/crowbar') local crowbar = require('item/crowbar')
crowbar:pickupMode() crowbar:install(r, 100, 160)
crowbar:setpos(100, 160)
crowbar.room = r
r:insert(crowbar)
return r return r