mirror of
https://github.com/wisplite/cardstock-system.git
synced 2026-06-27 15:27:09 -05:00
118 lines
3.4 KiB
Lua
118 lines
3.4 KiB
Lua
local gfx = require("gfx")
|
|
local anim = require("anim")
|
|
local keyboard = require("keyboard")
|
|
local gfxplus = require("gfxplus")
|
|
local doublebuf = require("doublebuf")
|
|
local width = gfx.width()
|
|
local height = gfx.height()
|
|
local GREY = gfxplus.hexConvert("#c1c1c1")
|
|
local buf = doublebuf.new(gfx, width, height)
|
|
local g = buf.g
|
|
|
|
-- Simple screen state + "dirty" redraw flag to avoid full-screen clearing every frame
|
|
local screen = "welcome" -- "welcome" | "testing"
|
|
local dirty = true
|
|
local transitioning = false
|
|
|
|
-- Frame limiting for animations to reduce visible "clear then draw" flicker on non-double-buffered displays.
|
|
local TARGET_FPS = 30
|
|
local STEP = 1 / TARGET_FPS
|
|
local acc = 0
|
|
|
|
local inputArmed = false
|
|
local wasPressed = false
|
|
|
|
local screenOpacity = { value = 1 }
|
|
local a = anim.new()
|
|
|
|
local function drawWelcome()
|
|
g.clear(0xFFFF)
|
|
g.setTextColor(gfxplus.withOpacity(0x0000, 0xFFFF, screenOpacity.value), 0xFFFF)
|
|
g.setTextSize(2)
|
|
g.drawCenterString("Welcome", math.floor(width / 2), math.floor(height / 2) - 15)
|
|
g.setTextSize(1)
|
|
g.drawCenterString("Press any button to continue", math.floor(width / 2), math.floor(height / 2) + 10)
|
|
g.setTextColor(gfxplus.withOpacity(GREY, 0xFFFF, screenOpacity.value), 0xFFFF)
|
|
g.setTextSize(1)
|
|
g.drawString("Paper Launcher v0.0.1", 5, height - 10)
|
|
end
|
|
|
|
local function drawTesting()
|
|
g.clear(0xFFFF)
|
|
g.setTextColor(gfxplus.withOpacity(0x0000, 0xFFFF, screenOpacity.value), 0xFFFF)
|
|
g.setTextSize(2)
|
|
g.drawCenterString("Testing", math.floor(width / 2), math.floor(height / 2) - 15)
|
|
end
|
|
|
|
function init()
|
|
-- Draw once on boot
|
|
screen = "welcome"
|
|
dirty = true
|
|
end
|
|
|
|
function tick(dt)
|
|
local pressed = keyboard.isPressed() > 0
|
|
|
|
-- Don't accept input until we see a clean "no keys pressed" state at least once.
|
|
if not inputArmed then
|
|
if not pressed then
|
|
inputArmed = true
|
|
end
|
|
wasPressed = pressed
|
|
return
|
|
end
|
|
|
|
local justPressed = pressed and (not wasPressed)
|
|
wasPressed = pressed
|
|
|
|
if screen == "welcome" and justPressed and (not transitioning) then
|
|
transitioning = true
|
|
|
|
-- Ensure we don't stack multiple tweens/timers for the same property.
|
|
a:clear()
|
|
screenOpacity.value = 1
|
|
|
|
a:to(screenOpacity, { value = 0 }, 1, {
|
|
ease = anim.ease.outCubic,
|
|
onComplete = function()
|
|
screen = "testing"
|
|
dirty = true
|
|
a:to(screenOpacity, { value = 1 }, 1, {
|
|
ease = anim.ease.outCubic,
|
|
onComplete = function()
|
|
transitioning = false
|
|
dirty = true
|
|
end
|
|
})
|
|
end
|
|
})
|
|
dirty = true
|
|
end
|
|
|
|
-- Advance animations at a fixed timestep to avoid redrawing "too fast" for the display.
|
|
if type(dt) == "number" and dt > 0 then
|
|
acc = acc + dt
|
|
if acc > 0.25 then acc = 0.25 end -- prevent spiral-of-death on long frames
|
|
|
|
local changed = false
|
|
while acc >= STEP do
|
|
if a:update(STEP) then changed = true end
|
|
acc = acc - STEP
|
|
end
|
|
if changed then dirty = true end
|
|
end
|
|
end
|
|
|
|
function draw()
|
|
if not dirty then return end
|
|
dirty = false
|
|
|
|
if screen == "welcome" then
|
|
drawWelcome()
|
|
buf.present()
|
|
return
|
|
end
|
|
|
|
drawTesting()
|
|
buf.present()
|
|
end |