112 lines
2.2 KiB
Text
112 lines
2.2 KiB
Text
-- Lesson 5: Your Own Functions
|
|
|
|
local LAYERS = 3
|
|
local STARS_PER_LAYER = 40
|
|
local ACROSS_STEP = 37
|
|
local DOWN_STEP = 61
|
|
local LAYER_SHIFT = 13
|
|
local LAYER_SPEED = 0.5
|
|
local LAYER_BRIGHT = 55
|
|
|
|
local PLAYER_WIDTH = 20
|
|
local PLAYER_HEIGHT = 6
|
|
local PLAYER_SPEED = 3
|
|
local PLAYER_MARGIN = 6
|
|
|
|
local width = overlayGetWidth()
|
|
local height = overlayGetHeight()
|
|
|
|
local drift = 0
|
|
local playerX = width // 2
|
|
local playerY = height - PLAYER_HEIGHT - PLAYER_MARGIN
|
|
local movingLeft = false
|
|
local movingRight = false
|
|
|
|
|
|
local function clamp(value, low, high)
|
|
if value < low then
|
|
return low
|
|
end
|
|
if value > high then
|
|
return high
|
|
end
|
|
return value
|
|
end
|
|
|
|
|
|
local function shadeFor(layer)
|
|
return math.random(60, 90) + layer * LAYER_BRIGHT
|
|
end
|
|
|
|
|
|
local function starAt(star, layer)
|
|
local x = (star * ACROSS_STEP + layer * LAYER_SHIFT) % width
|
|
local y = (star * DOWN_STEP + math.floor(drift * layer * LAYER_SPEED)) % height
|
|
return x, y
|
|
end
|
|
|
|
|
|
local function drawStar(x, y, shade)
|
|
colorForeground(shade, shade, shade)
|
|
overlayPlot(x, y)
|
|
end
|
|
|
|
|
|
local function drawLayer(layer)
|
|
for star = 1, STARS_PER_LAYER do
|
|
local x, y = starAt(star, layer)
|
|
drawStar(x, y, shadeFor(layer))
|
|
end
|
|
end
|
|
|
|
|
|
local function drawStars()
|
|
for layer = 1, LAYERS do
|
|
drawLayer(layer)
|
|
end
|
|
end
|
|
|
|
|
|
local function drawPlayer()
|
|
colorForeground(80, 255, 120)
|
|
overlayBox(playerX, playerY, playerX + PLAYER_WIDTH, playerY + PLAYER_HEIGHT)
|
|
end
|
|
|
|
|
|
local function movePlayer()
|
|
if movingLeft then
|
|
playerX = playerX - PLAYER_SPEED
|
|
end
|
|
if movingRight then
|
|
playerX = playerX + PLAYER_SPEED
|
|
end
|
|
playerX = clamp(playerX, 0, width - PLAYER_WIDTH - 1)
|
|
end
|
|
|
|
|
|
function onInputPressed(what)
|
|
if what == SWITCH_LEFT then
|
|
movingLeft = true
|
|
elseif what == SWITCH_RIGHT then
|
|
movingRight = true
|
|
end
|
|
end
|
|
|
|
|
|
function onInputReleased(what)
|
|
if what == SWITCH_LEFT then
|
|
movingLeft = false
|
|
elseif what == SWITCH_RIGHT then
|
|
movingRight = false
|
|
end
|
|
end
|
|
|
|
|
|
function onOverlayUpdate()
|
|
drift = drift + 1
|
|
overlayClear()
|
|
movePlayer()
|
|
drawStars()
|
|
drawPlayer()
|
|
return OVERLAY_UPDATED
|
|
end
|