-- title: Space Invaders
-- author: Bob Grant
-- desc: Lesson 14
-- script: lua
playerShip = {
position = {
x = 120,
y = 128
},
spriteNum = 0,
minX = 0,
maxX = 232,
speed = 1,
bulletOffset = {
x = 4,
y = 4
}
}
playerBullets = {}
maxPlayerBullets = 5
aliens = {}
alienRows = 6
alienColumns = 8
alienHorzSpacing = 12
alienVertSpacing = 12
gameNeedsToBeInitialised = true
function TIC()
-- game initialisation
-- check if game needs to be initialised
if (gameNeedsToBeInitialised) then
initialiseGame()
gameNeedsToBeInitialised = false
end
-- updating
movePlayerShip()
checkPlayerFire()
movePlayerBullet()
-- drawing / rendering
cls()
drawPlayerBullet()
drawPlayerShip()
drawAliens()
end -- end TIC
function movePlayerShip()
-- check move right button
if(btn(2)) then
playerShip.position.x =
playerShip.position.x - playerShip.speed
end
-- check move left button
if(btn(3)) then
playerShip.position.x =
playerShip.position.x + playerShip.speed
end
playerShip.position.x = checkLimits(
playerShip.position.x,
playerShip.minX,
playerShip.maxX )
end -- movePlayerShip
function checkLimits(value, min, max)
if (value > max) then
value = max
elseif (value < min) then
value = min
else
value = value
end
return value
end -- checkLimits
function checkPlayerFire()
local bulletFired = false
local bullet = 1
-- if fire button is pressed then
if (btnp(4)) then
-- find a bullet that's ready to fire
while (bullet <= maxPlayerBullets) and (not bulletFired) do
if (not playerBullets[bullet].active) then
-- initialise bullet
playerBullets[bullet].position = {
x = playerShip.position.x + playerShip.bulletOffset.x,
y = playerShip.position.y + playerShip.bulletOffset.y
}
-- mark bullet as active
playerBullets[bullet].active = true
-- stop other bullets from firing
bulletFired = true
end -- if not active
bullet = bullet + 1
end -- while
end -- if button pressed
end -- checkPlayerFire
function movePlayerBullet()
for bullet = 1, maxPlayerBullets do
if (playerBullets[bullet].active) then
-- move the bullet up the screen
playerBullets[bullet].position.y =
playerBullets[bullet].position.y - playerBullets[bullet].speed
if (playerBullets[bullet].position.y < 0) then
playerBullets[bullet].active = false
end
end
end
end -- movePlayerBullet
function drawPlayerBullet()
for bullet = 1, maxPlayerBullets do
if (playerBullets[bullet].active) then
-- draw player bullet
-- line(startX, StartY, endX, endY, colour)
line(
playerBullets[bullet].position.x,
playerBullets[bullet].position.y,
playerBullets[bullet].position.x,
playerBullets[bullet].position.y + playerBullets[bullet].length,
playerBullets[bullet].colour
)
end -- if
end -- for
end -- drawPlayerBullet
function drawPlayerShip()
spr(playerShip.spriteNum,
playerShip.position.x,
playerShip.position.y, 0)
end -- drawPlayerShip
function initialiseGame()
initPlayerBulletsArray()
initAliens()
end -- initialiseGame
function initPlayerBulletsArray()
for bullet = 1, maxPlayerBullets do
playerBullets[bullet] = {
position = {
x = 0,
y = 0
},
length = 5,
colour = 14,
speed = 2,
active = false
}
end -- for
end -- initPlayerBulletsArray
function initAliens()
-- create alien grid
for row = 1, alienRows do
-- create row of aliens
aliens[row] = {}
for column = 1,alienColumns do
-- create alien
aliens[row][column] = {
position = {
x = (column - 1) * alienHorzSpacing,
y = (row - 1) * alienVertSpacing
},
alive = true
}
-- end row
end
-- end alien grid
end
end -- initAliens
function drawAliens()
for row = 1, alienRows do
for column = 1, alienColumns do
if (aliens[row][column].alive) then
spr(16, aliens[row][column].position.x,
aliens[row][column].position.y)
end -- if
end -- columns
end -- rows
end -- drawAliens