64 lines
2.2 KiB
Lua
64 lines
2.2 KiB
Lua
local gfx <const> = playdate.graphics
|
|
|
|
local ButtonFont <const> = FontFullCircle
|
|
|
|
--- Assumes that background image is of size:
|
|
---
|
|
--- XXX
|
|
--- XOX
|
|
---
|
|
--- Where each character is the size of the screen, and 'O' is the default view.
|
|
function getDrawOffset(ballX, ballY)
|
|
local offsetX, offsetY
|
|
if ballY > C.Screen.H or ballX >= C.BallOffscreen then
|
|
return 0, 0
|
|
end
|
|
-- Keep the ball approximately in the center, once it's past C.Center.y - 30
|
|
offsetY = math.max(0, (-1 * ballY) + C.Center.y - 30)
|
|
|
|
if ballX >= 0 and ballX <= C.Screen.W then
|
|
offsetX = 0
|
|
elseif ballX < 0 then
|
|
offsetX = math.max(-1 * C.Screen.W, ballX * -1)
|
|
elseif ballX > C.Screen.W then
|
|
offsetX = math.min(C.Screen.W * 2, (ballX * -1) + C.Screen.W)
|
|
end
|
|
|
|
return offsetX * 1.3, offsetY
|
|
end
|
|
|
|
local buttonBlinker = gfx.animation.blinker.new(750, 500, true)
|
|
buttonBlinker:start()
|
|
|
|
--- Requires calling `playdate.graphics.animation.blinker.updateAll()` during `update()` to blink correctly.
|
|
function drawButton(buttonLabel, x, y)
|
|
gfx.setColor(gfx.kColorWhite)
|
|
gfx.fillCircleAtPoint(x + 4, y + 7, 12)
|
|
gfx.setColor(gfx.kColorBlack)
|
|
if buttonBlinker.on then
|
|
gfx.setLineWidth(1)
|
|
gfx.drawCircleAtPoint(x + 4, y + 7, 10)
|
|
end
|
|
ButtonFont:drawText(buttonLabel, x, y)
|
|
end
|
|
|
|
---@class Blipper
|
|
---@field draw fun(self: self, disableBlipping: boolean, x: number, y: number)
|
|
blipper = {}
|
|
|
|
--- Build an object that simply "blips" between the given images at the given interval.
|
|
--- Expects `playdate.graphics.animation.blinker.updateAll()` to be called on every update.
|
|
function blipper.new(msInterval, spriteCollection)
|
|
local blinker = gfx.animation.blinker.new(msInterval, msInterval, true)
|
|
blinker:start()
|
|
return {
|
|
blinker = blinker,
|
|
draw = function(self, disableBlipping, x, y, hasSpriteIndex)
|
|
local spriteBundle = spriteCollection[hasSpriteIndex.spriteIndex]
|
|
local currentImage = (disableBlipping or self.blinker.on) and spriteBundle.lowHat or spriteBundle.smiling
|
|
local offsetY = currentImage == spriteBundle.lowHat and -1 or 0
|
|
currentImage:draw(x, y + offsetY)
|
|
end,
|
|
}
|
|
end
|