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

View file

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

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

View file

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