Merge pull request 'feature/cast-overlay' (#33) from feature/cast-overlay into main
Reviewed-on: #33
This commit is contained in:
commit
3615435d08
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
|
end
|
||||||
|
|
||||||
function render:draw()
|
function render:draw()
|
||||||
-- пол -> тени -> спрайты -> свет -> оверлей
|
|
||||||
local weather = Tree.level.weather
|
local weather = Tree.level.weather
|
||||||
local txs = self.textures
|
local txs = self.textures
|
||||||
love.graphics.setCanvas(txs.lightLayer)
|
love.graphics.setCanvas(txs.lightLayer)
|
||||||
@ -75,13 +74,14 @@ function render:draw()
|
|||||||
love.graphics.setShader(lightShader)
|
love.graphics.setShader(lightShader)
|
||||||
love.graphics.draw(txs.floorLayer)
|
love.graphics.draw(txs.floorLayer)
|
||||||
|
|
||||||
|
love.graphics.setShader()
|
||||||
|
love.graphics.draw(txs.overlayLayer)
|
||||||
|
love.graphics.setShader(lightShader)
|
||||||
|
|
||||||
lightShader:send("scene", txs.spriteLayer)
|
lightShader:send("scene", txs.spriteLayer)
|
||||||
lightShader:send("light", txs.spriteLightLayer)
|
lightShader:send("light", txs.spriteLightLayer)
|
||||||
love.graphics.draw(txs.spriteLayer)
|
love.graphics.draw(txs.spriteLayer)
|
||||||
love.graphics.setShader()
|
love.graphics.setShader()
|
||||||
|
|
||||||
love.graphics.draw(txs.overlayLayer)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param params {w: number?, h: number?}
|
---@param params {w: number?, h: number?}
|
||||||
|
|||||||
@ -112,6 +112,7 @@ function skillRow.new(characterId)
|
|||||||
if not behavior.cast then
|
if not behavior.cast then
|
||||||
behavior.cast = behavior.spellbook[i]
|
behavior.cast = behavior.spellbook[i]
|
||||||
behavior.state = "casting"
|
behavior.state = "casting"
|
||||||
|
behavior.spellbook[i]:onSelected(char)
|
||||||
else
|
else
|
||||||
behavior.state = "idle"
|
behavior.state = "idle"
|
||||||
behavior.cast = nil
|
behavior.cast = nil
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
local Query = require "lib.spell.target_query"
|
local Query = require "lib.spell.target_query"
|
||||||
local targetTest = require "lib.spell.target_test"
|
local targetTest = require "lib.spell.target_test"
|
||||||
local task = require "lib.utils.task"
|
local task = require "lib.utils.task"
|
||||||
|
local easing = require "lib.utils.easing"
|
||||||
|
|
||||||
--- @alias SpellPreview "default" Подсветка возможных целей
|
--- @alias SpellPreview "default" Подсветка возможных целей
|
||||||
--- | "path" Подсветка пути до цели
|
--- | "path" Подсветка пути до цели
|
||||||
@ -23,6 +24,15 @@ spell.baseCooldown = 1
|
|||||||
spell.targetQuery = Query(targetTest.any)
|
spell.targetQuery = Query(targetTest.any)
|
||||||
spell.previewType = "default"
|
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)
|
function spell:update(caster, dt)
|
||||||
if self.previewType == "path" then
|
if self.previewType == "path" then
|
||||||
local charPos = caster:has(Tree.behaviors.positioned).position:floor()
|
local charPos = caster:has(Tree.behaviors.positioned).position:floor()
|
||||||
@ -36,16 +46,33 @@ function spell:update(caster, dt)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local icons = require("lib.utils.sprite_atlas").load(Tree.assets.files.overlay_icons)
|
||||||
|
|
||||||
function spell:draw()
|
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
|
if self.previewType == "path" then
|
||||||
local path = self.path --[[@as Deque?]]
|
local path = self.path --[[@as Deque?]]
|
||||||
if not path then return end
|
if not path then return end
|
||||||
--- Это отрисовка пути персонажа к мышке
|
--- Это отрисовка пути персонажа к мышке
|
||||||
Tree.level.camera:attach()
|
Tree.level.camera:attach()
|
||||||
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
|
love.graphics.setCanvas(Tree.level.render.textures.overlayLayer)
|
||||||
love.graphics.setColor(0.6, 0.75, 0.5)
|
|
||||||
for p in path:values() do
|
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
|
end
|
||||||
love.graphics.setCanvas()
|
love.graphics.setCanvas()
|
||||||
Tree.level.camera:detach()
|
Tree.level.camera:detach()
|
||||||
|
|||||||
@ -48,7 +48,7 @@ end
|
|||||||
function query:asSet(caster)
|
function query:asSet(caster)
|
||||||
--- @TODO: оптимизировать и брать не всю карту для выборки
|
--- @TODO: оптимизировать и брать не всю карту для выборки
|
||||||
local res = {}
|
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
|
if self.test(caster, tile.position) then
|
||||||
table.insert(res, tile.position)
|
table.insert(res, tile.position)
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user