diff options
| author | cursed22bc <admin@pixeldawn.org> | 2026-03-10 20:52:33 +0200 |
|---|---|---|
| committer | cursed22bc <admin@pixeldawn.org> | 2026-03-10 20:52:33 +0200 |
| commit | a64d77bc12cadb3989a7faf094adc1d5c581d565 (patch) | |
| tree | 86bc2a3876c3cd42b86772eaff755549590e57c8 | |
| parent | 9d95968c3e732be915f10841d1d659e37b3b5d03 (diff) | |
text triggers
| -rw-r--r-- | textTrigger.lua | 55 | ||||
| -rw-r--r-- | textbox.lua | 2 | ||||
| -rw-r--r-- | tilemap.lua | 9 | ||||
| -rw-r--r-- | world.lua | 20 |
4 files changed, 83 insertions, 3 deletions
diff --git a/textTrigger.lua b/textTrigger.lua new file mode 100644 index 0000000..5202a8c --- /dev/null +++ b/textTrigger.lua @@ -0,0 +1,55 @@ +local Entity = require("entity") + +local TextTrigger = {} +TextTrigger.__index = TextTrigger + +function TextTrigger.new(entity) + local self = setmetatable({}, TextTrigger) + + self.x = entity.x + self.y = entity.y + self.width = entity.width + self.height = entity.height + + self.text = entity:get("text", "") + self.timesToShow = tonumber(entity:get("times_to_show", 1)) or 1 + + self.body = nil + self.fixture = nil + self.isTextTrigger = true + + return self +end + +function TextTrigger:setWorldPhysics(world) + local cx = self.x + self.width / 2 + local cy = self.y + self.height / 2 + + self.body = love.physics.newBody(world, cx, cy, "static") + local shape = love.physics.newRectangleShape(self.width, self.height) + + self.fixture = love.physics.newFixture(self.body, shape) + self.fixture:setSensor(true) + self.fixture:setUserData(self) +end + +function TextTrigger:syncFromPhysicsBody() end + +function TextTrigger:trigger(world, player) + if self.timesToShow < 1 then return end + + world.playerTextbox:show( + self.text, + { player.x + player.width/2, player.y - 20, "center" }, + "write", + { life = 3, fontSize = 9, centeredText = true, wrapToFit = true } + ) + + self.timesToShow = self.timesToShow - 1 +end + +function TextTrigger:update(dt) end + +function TextTrigger:draw() end + +return TextTrigger
\ No newline at end of file diff --git a/textbox.lua b/textbox.lua index 35b66a4..934b7f5 100644 --- a/textbox.lua +++ b/textbox.lua @@ -131,8 +131,6 @@ function Textbox:draw() end local prevFont = love.graphics.getFont() love.graphics.setFont(self.font) - love.graphics.setColor(0, 0, 0, 0.8) - love.graphics.rectangle("fill", x, y, self.width, self.height) love.graphics.setColor(1, 1, 1, 1) love.graphics.printf(self.visibleText, textX, textY, self.width - padding * 2, textAlign) love.graphics.setFont(prevFont) diff --git a/tilemap.lua b/tilemap.lua index 44d0db5..f706e55 100644 --- a/tilemap.lua +++ b/tilemap.lua @@ -2,6 +2,7 @@ local Entity = require("entity") local Liquid = require("liquid") local LiquidSurface = require("liquidSurface") local Spike = require("spike") +local TextTrigger = require("textTrigger") local Tilemap = {} Tilemap.__index = Tilemap @@ -54,6 +55,7 @@ function Tilemap:new(mapPath, tilesets) self.entitiesLiquidPolygons = {} self.entitiesLiquidSurfaces = {} self.entitiesSpikes = {} + self.entitiesTextTriggers = {} self.layerBackground = nil self.layerDecorationBackground = nil self.layerDecorationForeground = nil @@ -132,7 +134,8 @@ function Tilemap:new(mapPath, tilesets) table.insert(self.entitiesSpawns, entity) elseif name == "spikes" then table.insert(self.entitiesSpikes, Spike.new(entity)) - + elseif name == "text_trigger" then + table.insert(self.entitiesTextTriggers, TextTrigger.new(entity)) elseif name == "camera_border" then table.insert(self.entitiesCameraBorders, entity) elseif name == "liquid" then @@ -168,6 +171,10 @@ function Tilemap:getEntitiesSpikes() return self.entitiesSpikes end +function Tilemap:getEntitiesTextTriggers() + return self.entitiesTextTriggers +end + function Tilemap:getEntitiesCameraBorders() return self.entitiesCameraBorders end @@ -24,6 +24,7 @@ function World:new() self.liquidSurfaces = {} self.liquidSurfaceFixtures = {} self.spikes = {} + self.textTriggers = {} self.refractionCanvas = nil self.liquidShader = nil self.activeSplashes = {} @@ -153,6 +154,12 @@ function World:load(mapPath, tilesets) table.insert(self.entities, spike) end + for _, textTrigger in ipairs(self.tilemap:getEntitiesTextTriggers()) do + textTrigger:setWorldPhysics(self.physicsWorld) + table.insert(self.textTriggers, textTrigger) + table.insert(self.entities, textTrigger) + end + local ok, shader = pcall(love.graphics.newShader, "shaders/liquid.glsl") self.liquidShader = ok and shader or nil if not self.liquidShader then @@ -198,7 +205,19 @@ function World:_isHazard(ud) return type(ud) == "table" and (ud.isSpike or ud.isEnemy) end +function World:handleTextTrigger(trigger, player) + if trigger and player and trigger.isTextTrigger and self:_isPlayerLike(player) then + trigger:trigger(self, player) + end +end + function World:_onBeginContact(udA, udB, nx, ny, contact) + if type(udA) == "table" and udA.isTextTrigger then + self:handleTextTrigger(udA, udB) + elseif type(udB) == "table" and udB.isTextTrigger then + self:handleTextTrigger(udB, udA) + end + if udA == "ground" and self:_isTrackedEntity(udB) then local kind = self:_normalToContactType(nx, ny) if kind then @@ -217,6 +236,7 @@ function World:_onBeginContact(udA, udB, nx, ny, contact) end self.groundContacts[udA] = (self.groundContacts[udA] or 0) + 1 if self:_isPlayerLike(udA) then udA.grounded = true end + end local function doWaterSplash(waterData, entity) |
