OMA-COMMAND — Missile Command arcade clone in Love2D with Omarchy theme integration. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
70 lines
2.2 KiB
Lua
70 lines
2.2 KiB
Lua
local World = require("game.world")
|
|
local Palette = require("rendering.palette")
|
|
|
|
local Crosshair = {
|
|
x = 128,
|
|
y = 116,
|
|
targets = {},
|
|
}
|
|
|
|
function Crosshair.update()
|
|
local mx, my = love.mouse.getPosition()
|
|
Crosshair.x, Crosshair.y = World.toGame(mx, my)
|
|
end
|
|
|
|
function Crosshair.addTarget(x, y)
|
|
table.insert(Crosshair.targets, {x = x, y = y, time = 0})
|
|
end
|
|
|
|
function Crosshair.updateTargets(dt)
|
|
for i = #Crosshair.targets, 1, -1 do
|
|
Crosshair.targets[i].time = Crosshair.targets[i].time + dt
|
|
end
|
|
end
|
|
|
|
function Crosshair.removeTarget(x, y)
|
|
for i = #Crosshair.targets, 1, -1 do
|
|
local t = Crosshair.targets[i]
|
|
if math.abs(t.x - x) < 1 and math.abs(t.y - y) < 1 then
|
|
table.remove(Crosshair.targets, i)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
function Crosshair.draw()
|
|
local p = Palette.get(World.wave)
|
|
local lw = 1 / World.scale
|
|
local t = love.timer.getTime()
|
|
|
|
-- Target markers: pulsing wireframe squares
|
|
for _, tgt in ipairs(Crosshair.targets) do
|
|
local pulse = 0.3 + math.sin(tgt.time * 15) * 0.3
|
|
love.graphics.setColor(p.crosshair[1], p.crosshair[2], p.crosshair[3], pulse)
|
|
love.graphics.setLineWidth(lw)
|
|
local s = 2.5
|
|
love.graphics.rectangle("line", tgt.x - s, tgt.y - s, s*2, s*2)
|
|
end
|
|
|
|
-- Crosshair: vector-style rotating brackets
|
|
local size = 5
|
|
local gap = 1.5
|
|
local rot = t * 0.5 -- slow rotation
|
|
|
|
love.graphics.setColor(p.crosshair)
|
|
love.graphics.setLineWidth(lw * 2)
|
|
|
|
-- Four corner brackets
|
|
-- Top
|
|
love.graphics.line(Crosshair.x - size, Crosshair.y - gap, Crosshair.x - size, Crosshair.y - size, Crosshair.x - gap, Crosshair.y - size)
|
|
love.graphics.line(Crosshair.x + gap, Crosshair.y - size, Crosshair.x + size, Crosshair.y - size, Crosshair.x + size, Crosshair.y - gap)
|
|
-- Bottom
|
|
love.graphics.line(Crosshair.x + size, Crosshair.y + gap, Crosshair.x + size, Crosshair.y + size, Crosshair.x + gap, Crosshair.y + size)
|
|
love.graphics.line(Crosshair.x - gap, Crosshair.y + size, Crosshair.x - size, Crosshair.y + size, Crosshair.x - size, Crosshair.y + gap)
|
|
|
|
-- Centre dot
|
|
love.graphics.setColor(p.bright)
|
|
love.graphics.circle("fill", Crosshair.x, Crosshair.y, 0.5, 6)
|
|
end
|
|
|
|
return Crosshair
|