134 lines
2.5 KiB
Text
134 lines
2.5 KiB
Text
-- Lesson 6: Lists Of Things
|
|
|
|
local STAR_COUNT = 120
|
|
local STAR_SHADE = 55
|
|
local BURST_COUNT = 10
|
|
|
|
local PLAYER_WIDTH = 20
|
|
local PLAYER_HEIGHT = 6
|
|
local PLAYER_SPEED = 3
|
|
local PLAYER_MARGIN = 6
|
|
|
|
local width = overlayGetWidth()
|
|
local height = overlayGetHeight()
|
|
|
|
local stars = {}
|
|
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 newStar(y)
|
|
local speed = math.random(1, 3)
|
|
local star = {
|
|
x = math.random(0, width - 1),
|
|
y = y,
|
|
speed = speed,
|
|
shade = math.random(60, 90) + speed * STAR_SHADE
|
|
}
|
|
return star
|
|
end
|
|
|
|
|
|
local function makeStars()
|
|
for number = 1, STAR_COUNT do
|
|
table.insert(stars, newStar(math.random(0, height - 1)))
|
|
end
|
|
end
|
|
|
|
|
|
local function addBurst()
|
|
for number = 1, BURST_COUNT do
|
|
table.insert(stars, newStar(0))
|
|
end
|
|
end
|
|
|
|
|
|
local function moveStars()
|
|
for i = #stars, 1, -1 do
|
|
local star = stars[i]
|
|
star.y = star.y + star.speed
|
|
if star.y >= height then
|
|
table.remove(stars, i)
|
|
end
|
|
end
|
|
while #stars < STAR_COUNT do
|
|
table.insert(stars, newStar(0))
|
|
end
|
|
end
|
|
|
|
|
|
local function drawStar(star)
|
|
colorForeground(star.shade, star.shade, star.shade)
|
|
overlayPlot(star.x, star.y)
|
|
end
|
|
|
|
|
|
local function drawStars()
|
|
for _, star in ipairs(stars) do
|
|
drawStar(star)
|
|
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
|
|
elseif what == SWITCH_BUTTON1 then
|
|
addBurst()
|
|
end
|
|
end
|
|
|
|
|
|
function onInputReleased(what)
|
|
if what == SWITCH_LEFT then
|
|
movingLeft = false
|
|
elseif what == SWITCH_RIGHT then
|
|
movingRight = false
|
|
end
|
|
end
|
|
|
|
|
|
function onOverlayUpdate()
|
|
overlayClear()
|
|
movePlayer()
|
|
moveStars()
|
|
drawStars()
|
|
drawPlayer()
|
|
overlayPrint(0, 0, "Stars: " .. #stars)
|
|
return OVERLAY_UPDATED
|
|
end
|
|
|
|
|
|
makeStars()
|