feature/simple_ui #18
21
lib/simple_ui/element.lua
Normal file
21
lib/simple_ui/element.lua
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
local Rect = require "lib.simple_ui.rect"
|
||||||
|
|
||||||
|
--- @class UIElement
|
||||||
|
--- @field bounds Rect Прямоугольник, в границах которого размещается элемент. Размеры и положение в *локальных* координатах
|
||||||
|
--- @field transform love.Transform Преобразование из локальных координат элемента (bounds) в экранные координаты
|
||||||
|
local uiElement = {
|
||||||
|
bounds = Rect {},
|
||||||
|
transform = love.math.newTransform()
|
||||||
|
}
|
||||||
|
uiElement.__index = uiElement
|
||||||
|
|
||||||
|
function uiElement:update(dt) end
|
||||||
|
|
||||||
|
function uiElement:draw() end
|
||||||
|
|
||||||
|
function uiElement:hitTest(screenX, screenY)
|
||||||
|
local lx, ly = self.transform:inverseTransformPoint(screenX, screenY)
|
||||||
|
return self.bounds:hasPoint(lx, ly)
|
||||||
|
end
|
||||||
|
|
||||||
|
return uiElement
|
||||||
@ -1,32 +1,8 @@
|
|||||||
local icons = require("lib.utils.sprite_atlas").load(Tree.assets.files.dev_icons)
|
local icons = require("lib.utils.sprite_atlas").load(Tree.assets.files.dev_icons)
|
||||||
local easing = require "lib.utils.easing"
|
local easing = require "lib.utils.easing"
|
||||||
local AnimationNode = require "lib.animation_node"
|
local AnimationNode = require "lib.animation_node"
|
||||||
|
local Element = require "lib.simple_ui.element"
|
||||||
--- @class UIElement
|
local Rect = require "lib.simple_ui.rect"
|
||||||
local uiElement = {
|
|
||||||
x = 0,
|
|
||||||
y = 0,
|
|
||||||
width = 0,
|
|
||||||
height = 0,
|
|
||||||
transform = love.math.newTransform()
|
|
||||||
}
|
|
||||||
uiElement.__index = uiElement
|
|
||||||
|
|
||||||
function uiElement:update(dt) end
|
|
||||||
|
|
||||||
function uiElement:draw() end
|
|
||||||
|
|
||||||
function uiElement:show(animationNode) end
|
|
||||||
|
|
||||||
function uiElement:hide(animationNode) end
|
|
||||||
|
|
||||||
function uiElement:hitTest(screenX, screenY)
|
|
||||||
local lx, ly = self.transform:inverseTransformPoint(screenX, screenY)
|
|
||||||
local belongs = function(value, lower, upper)
|
|
||||||
return value >= lower and value < upper
|
|
||||||
end
|
|
||||||
return belongs(lx, self.x, self.x + self.width) and belongs(ly, self.y, self.y + self.height)
|
|
||||||
end
|
|
||||||
|
|
||||||
--- @class SkillButton : UIElement
|
--- @class SkillButton : UIElement
|
||||||
--- @field showNode AnimationNode?
|
--- @field showNode AnimationNode?
|
||||||
@ -35,7 +11,7 @@ end
|
|||||||
--- @field selected boolean
|
--- @field selected boolean
|
||||||
--- @field onClick function?
|
--- @field onClick function?
|
||||||
--- @field icon string
|
--- @field icon string
|
||||||
local skillButton = setmetatable({}, uiElement)
|
local skillButton = setmetatable({}, Element)
|
||||||
skillButton.__index = skillButton
|
skillButton.__index = skillButton
|
||||||
|
|
||||||
function skillButton.new(icon)
|
function skillButton.new(icon)
|
||||||
@ -99,7 +75,7 @@ end
|
|||||||
--- @field characterId Id
|
--- @field characterId Id
|
||||||
--- @field selected SkillButton?
|
--- @field selected SkillButton?
|
||||||
--- @field children SkillButton[]
|
--- @field children SkillButton[]
|
||||||
local skillRow = setmetatable({}, uiElement)
|
local skillRow = setmetatable({}, Element)
|
||||||
skillRow.__index = skillRow
|
skillRow.__index = skillRow
|
||||||
|
|
||||||
--- @param characterId Id
|
--- @param characterId Id
|
||||||
@ -151,15 +127,17 @@ function skillRow:update(dt)
|
|||||||
local screenW, screenH = love.graphics.getDimensions()
|
local screenW, screenH = love.graphics.getDimensions()
|
||||||
local padding = 8
|
local padding = 8
|
||||||
local count = #self.children
|
local count = #self.children
|
||||||
self.width, self.height, self.x, self.y = count * icons.tileSize + (count - 1) * padding, iconSize, 0,
|
|
||||||
0 -- в локальных координатах
|
|
||||||
|
|
||||||
|
self.bounds = Rect {
|
||||||
|
width = count * icons.tileSize + (count - 1) * padding,
|
||||||
|
height = iconSize
|
||||||
|
}
|
||||||
self.transform = love.math.newTransform():translate(screenW / 2,
|
self.transform = love.math.newTransform():translate(screenW / 2,
|
||||||
screenH - 16):scale(scale, scale):translate(-self.width / 2, -iconSize)
|
screenH - 16):scale(scale, scale):translate(-self.bounds.width / 2, -iconSize)
|
||||||
|
|
||||||
for i, skb in ipairs(self.children) do
|
for i, skb in ipairs(self.children) do
|
||||||
skb.width, skb.height = iconSize, iconSize
|
skb.bounds = Rect { height = iconSize, width = iconSize }
|
||||||
skb.transform = self.transform:clone():translate(self.x + (i - 1) * iconSize +
|
skb.transform = self.transform:clone():translate(self.bounds.x + (i - 1) * iconSize +
|
||||||
(i - 1) *
|
(i - 1) *
|
||||||
padding, -- левый край ряда + размер предыдущих иконок + размер предыдущих отступов
|
padding, -- левый край ряда + размер предыдущих иконок + размер предыдущих отступов
|
||||||
0 -- высота не меняется
|
0 -- высота не меняется
|
||||||
24
lib/simple_ui/rect.lua
Normal file
24
lib/simple_ui/rect.lua
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
--- @class Rect
|
||||||
|
--- @field x number
|
||||||
|
--- @field y number
|
||||||
|
--- @field width number
|
||||||
|
--- @field height number
|
||||||
|
local rect = {}
|
||||||
|
rect.__index = rect
|
||||||
|
|
||||||
|
--- @param table {x: number, y: number, width: number, height: number}
|
||||||
|
function rect.new(table)
|
||||||
|
local r = {
|
||||||
|
x = table.x or 0,
|
||||||
|
y = table.y or 0,
|
||||||
|
width = table.width or 0,
|
||||||
|
height = table.height or 0
|
||||||
|
}
|
||||||
|
return setmetatable(r, rect)
|
||||||
|
end
|
||||||
|
|
||||||
|
function rect:hasPoint(x, y)
|
||||||
|
return x >= self.x and x < self.width and y >= self.y and y < self.height
|
||||||
|
end
|
||||||
|
|
||||||
|
return rect.new
|
||||||
2
main.lua
2
main.lua
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
local character = require "lib/character/character"
|
local character = require "lib/character/character"
|
||||||
require "lib/tree"
|
require "lib/tree"
|
||||||
local testLayout = require "lib.simple_ui.level_layout"
|
local testLayout = require "lib.simple_ui.level.layout"
|
||||||
|
|
||||||
function love.conf(t)
|
function love.conf(t)
|
||||||
t.console = true
|
t.console = true
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user