From a50a6e2734584628c43f3984cb57ab174e4d5b99 Mon Sep 17 00:00:00 2001 From: Hyeonung Baek Date: Wed, 1 Jan 2025 18:43:35 +0900 Subject: [PATCH] Basic prototype --- conf.lua | 4 ++- export.sh | 2 +- item.lua | 47 +++++++++++++++++++++++++++++++ item/crowbar.lua | 16 +++++++++++ items.lua | 5 ++++ main.lua | 72 ++++++++++++++++++++++++++++++++++++++++++------ object.lua | 16 +++++++++++ room.lua | 16 ++++++++++- room/default.lua | 6 ++++ window.lua | 9 ++---- 10 files changed, 175 insertions(+), 18 deletions(-) create mode 100644 item.lua create mode 100644 item/crowbar.lua create mode 100644 items.lua create mode 100644 object.lua diff --git a/conf.lua b/conf.lua index 95270a8..5f575b4 100644 --- a/conf.lua +++ b/conf.lua @@ -1,8 +1,10 @@ -WIDTH = 400 +WIDTH = 528 HEIGHT = 300 MULTIPLIER = 1.2 function love.conf(t) + --[[ t.window.width = MULTIPLIER * WIDTH t.window.height = MULTIPLIER * HEIGHT + --]] end diff --git a/export.sh b/export.sh index 20b8b36..0f534ea 100755 --- a/export.sh +++ b/export.sh @@ -1,5 +1,5 @@ #!/bin/sh rm garden.love -zip -r garden.love res/ room/ *.lua +zip -r garden.love res/ room/ item/ *.lua cp garden.love ~/storage/downloads/ diff --git a/item.lua b/item.lua new file mode 100644 index 0000000..62a0c29 --- /dev/null +++ b/item.lua @@ -0,0 +1,47 @@ +local window = require('window') +-- item prototype +-- name +-- image +-- description + +local m = { + _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 + +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) + self.mousepressed = window.mousepressed(function (self, x, y, button) + self:itemMode() + self.room:remove(self) + inventory:pickup(self) + end) +end + +function m:itemMode() + self.mousepressed = window.mousepressed(function (self, x, y, button) + log:info(self) + end) +end + +return m diff --git a/item/crowbar.lua b/item/crowbar.lua new file mode 100644 index 0000000..a0fe500 --- /dev/null +++ b/item/crowbar.lua @@ -0,0 +1,16 @@ +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 + +return m diff --git a/items.lua b/items.lua new file mode 100644 index 0000000..ad8ec75 --- /dev/null +++ b/items.lua @@ -0,0 +1,5 @@ +local m = { + ['crowbar'] = require('item/crowbar') +} + +return m diff --git a/main.lua b/main.lua index 317507c..9fa8313 100644 --- a/main.lua +++ b/main.lua @@ -12,7 +12,9 @@ screen = { } screen.mousepressed = window.mousepressed(function (self, x, y, button) - end) + log:log(string.format("%d, %d", x, y)) + current_room:mousepressed(x, y, button) +end) screen.draw = window.draw(function (self) current_room:draw() @@ -26,34 +28,80 @@ inventory = { items = {} } +inventory.mousepressed = window.propagate{'items'} + inventory.draw = window.draw(function (self) - for _, item in ipairs(self.items) do - -- item:setpos(x, y) + local x = 0 + for _, item in pairs(self.items) do + item:setpos(x, 0) item:draw() + x = item.width end window.draw_border(self.width, self.height) end) +function inventory:pickup(item) + self.items[item.name] = item +end + log = { x = inventory.width , y = 0, - width = 80, + width = WIDTH - screen.width, height = HEIGHT, + lines = {}, } +log.limit = log.width - 10 + +local font = love.graphics.getFont() +local font_height = font:getHeight('L') +local line_limit = log.height / font_height + log.draw = window.draw(function (self) + local i = 0 + for _, l in ipairs(self.lines) do + local rw, wl = font:getWrap(l, self.limit) + local th = font:getHeight(l) + love.graphics.printf(l, 5, 5 + i*th, self.limit) + i = i + #wl + end + window.draw_border(self.width, self.height) end) -function love.load() - timer = 0 +function log:log(str) + table.insert(self.lines, str) + + local i = 0 + for _, l in ipairs(self.lines) do + local rw, wl = font:getWrap(l, self.limit) + local th = font:getHeight(l) + i = i + #wl + end + + while i > line_limit do + local l = self.lines[1] + local rw, wl = font:getWrap(l, self.limit) + local th = font:getHeight(l) + + i = i - #wl + table.remove(self.lines, 1) + end end -function love.mousepressed(x, y, button) - local x, y = x / MULTIPLIER, y / MULTIPLIER +function log:info(o) + if o._t == 'item' then + self:log(string.format("It's %s. %s", o.name, o.description)) + else + self:log("There's no info for that.") + end +end + +function love.load() + log:log("Welcome to the garden.") end function love.update(dt) - timer = timer + dt end mw, mh = 0, 0 @@ -62,6 +110,12 @@ if love.system.getOS() == 'android' then mh = (love.window.getHeight() - HEIGHT) / 2 end +function love.mousepressed(x, y, button) + local x, y = (x - mw) / MULTIPLIER, (y - mh) / MULTIPLIER + screen:mousepressed(x, y, button) + inventory:mousepressed(x, y, button) +end + function love.draw() love.graphics.push() love.graphics.translate(mw, mh) diff --git a/object.lua b/object.lua new file mode 100644 index 0000000..4d16a6c --- /dev/null +++ b/object.lua @@ -0,0 +1,16 @@ +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 1577722..d69c94e 100644 --- a/room.lua +++ b/room.lua @@ -5,6 +5,7 @@ local window = require('window') -- - objects -- - edges local room = { + x = 0, y = 0, background = love.graphics.newImage("res/defaultbg.png"), edges = {}, objects = {}, @@ -33,11 +34,24 @@ function room:new() return m end +function room:insert(obj) + table.insert(self.objects, obj) + obj.idx = #self.objects +end + +function room:remove(obj) + table.remove(self.objects, obj.idx) + + for i, v in ipairs(self.objects) do + v.idx = i + end +end + room.mousepressed = window.propagate{'edges', 'objects'} function room:draw() love.graphics.draw(self.background, 0, 0) - + for i, v in ipairs(self.objects) do v:draw() end diff --git a/room/default.lua b/room/default.lua index 41f24d1..d5cbdf7 100644 --- a/room/default.lua +++ b/room/default.lua @@ -4,4 +4,10 @@ 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) + return r diff --git a/window.lua b/window.lua index 5160b41..5671777 100644 --- a/window.lua +++ b/window.lua @@ -23,14 +23,11 @@ end function w.propagate(tnames) return function(self, x, y, button) + local x, y = x - self.x, y - self.y + for _, tname in ipairs(tnames) do for i, v in pairs(self[tname]) do - local x, y = x - v.x, y - v.y - - if 0 <= x and x <= v.width and 0 <= y and y <= v.height then - v:mousepressed(x, y, button) - return - end + v:mousepressed(x, y, button) end end end