feature/cast-overlay #33
BIN
assets/overlay_icons/atlas.png
Normal file
BIN
assets/overlay_icons/atlas.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 317 B |
5
assets/overlay_icons/manifest.lua
Normal file
5
assets/overlay_icons/manifest.lua
Normal file
@ -0,0 +1,5 @@
|
||||
return {
|
||||
tileSize = 32,
|
||||
["dev_target"] = { 0 },
|
||||
["dev_path"] = { 1 },
|
||||
}
|
||||
@ -58,7 +58,6 @@ function render:applyBlur(input, radius)
|
||||
end
|
||||
|
||||
function render:draw()
|
||||
-- пол -> тени -> спрайты -> свет -> оверлей
|
||||
local weather = Tree.level.weather
|
||||
local txs = self.textures
|
||||
love.graphics.setCanvas(txs.lightLayer)
|
||||
@ -75,13 +74,14 @@ function render:draw()
|
||||
love.graphics.setShader(lightShader)
|
||||
love.graphics.draw(txs.floorLayer)
|
||||
|
||||
love.graphics.setShader()
|
||||
love.graphics.draw(txs.overlayLayer)
|
||||
love.graphics.setShader(lightShader)
|
||||
|
||||
lightShader:send("scene", txs.spriteLayer)
|
||||
lightShader:send("light", txs.spriteLightLayer)
|
||||
love.graphics.draw(txs.spriteLayer)
|
||||
love.graphics.setShader()
|
||||
|
||||
love.graphics.draw(txs.overlayLayer)
|
||||
end
|
||||
|
||||
---@param params {w: number?, h: number?}
|
||||
|
||||
@ -112,6 +112,7 @@ function skillRow.new(characterId)
|
||||
if not behavior.cast then
|
||||
behavior.cast = behavior.spellbook[i]
|
||||
behavior.state = "casting"
|
||||
behavior.spellbook[i]:onSelected(char)
|
||||
else
|
||||
behavior.state = "idle"
|
||||
behavior.cast = nil
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
local Query = require "lib.spell.target_query"
|
||||
local targetTest = require "lib.spell.target_test"
|
||||
local task = require "lib.utils.task"
|
||||
local easing = require "lib.utils.easing"
|
||||
|
||||
--- @alias SpellPreview "default" Подсветка возможных целей
|
||||
--- | "path" Подсветка пути до цели
|
||||
@ -23,6 +24,15 @@ spell.baseCooldown = 1
|
||||
spell.targetQuery = Query(targetTest.any)
|
||||
spell.previewType = "default"
|
||||
|
||||
|
||||
--- Вызывается, когда игрок выбирает спелл на панели заклинаний
|
||||
--- @param caster Character
|
||||
function spell:onSelected(caster)
|
||||
self.targets = self.targetQuery:asSet(caster)
|
||||
self.tSize = 0.67 -- анимация появления таргетов
|
||||
task.tween(self, { tSize = 1 }, 200, easing.easeOutQuad)
|
||||
end
|
||||
|
||||
function spell:update(caster, dt)
|
||||
if self.previewType == "path" then
|
||||
local charPos = caster:has(Tree.behaviors.positioned).position:floor()
|
||||
@ -36,16 +46,33 @@ function spell:update(caster, dt)
|
||||
end
|
||||
end
|
||||
|
||||
local icons = require("lib.utils.sprite_atlas").load(Tree.assets.files.overlay_icons)
|
||||
|
||||
function spell:draw()
|
||||
Tree.level.camera:attach()
|
||||
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
|
||||
love.graphics.setColor(1, 1, 1, 0.5)
|
||||
for _, p in pairs(self.targets) do
|
||||
local s = self.tSize / Tree.level.camera.pixelsPerMeter
|
||||
local quad = icons:pickQuad('dev_target')
|
||||
love.graphics.draw(icons.atlas, quad, p.x + 0.5 - self.tSize / 2, p.y + 0.5 - self.tSize / 2, 0, s, s)
|
||||
end
|
||||
love.graphics.setShader()
|
||||
|
||||
love.graphics.setCanvas()
|
||||
Tree.level.camera:detach()
|
||||
love.graphics.setColor(1, 1, 1)
|
||||
|
||||
if self.previewType == "path" then
|
||||
local path = self.path --[[@as Deque?]]
|
||||
if not path then return end
|
||||
--- Это отрисовка пути персонажа к мышке
|
||||
Tree.level.camera:attach()
|
||||
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
|
||||
love.graphics.setColor(0.6, 0.75, 0.5)
|
||||
for p in path:values() do
|
||||
love.graphics.circle("fill", p.x + 0.45, p.y + 0.45, 0.1)
|
||||
local s = 1 / Tree.level.camera.pixelsPerMeter
|
||||
local quad = icons:pickQuad('dev_path')
|
||||
love.graphics.draw(icons.atlas, quad, p.x, p.y, 0, s, s)
|
||||
end
|
||||
love.graphics.setCanvas()
|
||||
Tree.level.camera:detach()
|
||||
|
||||
@ -48,7 +48,7 @@ end
|
||||
function query:asSet(caster)
|
||||
--- @TODO: оптимизировать и брать не всю карту для выборки
|
||||
local res = {}
|
||||
for _, tile in pairs(Tree.level.tileGrid) do
|
||||
for _, tile in pairs(Tree.level.tileGrid.__grid) do
|
||||
if self.test(caster, tile.position) then
|
||||
table.insert(res, tile.position)
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user