function love.load()
arenaWidth = 800
arenaHeight = 600
shipX = arenaWidth / 2
shipY = arenaHeight / 2
shipAngle = 0
shipSpeedX = 0
shipSpeedY = 0
shipRadius = 30
bullets = {}
bulletTimerLimit = 0.5
bulletTimer = bulletTimerLimit
bulletRadius = 5
asteroids = {
{
x = 100,
y = 100,
},
{
x = arenaWidth - 100,
y = 100,
},
{
x = arenaWidth / 2,
y = arenaHeight - 100,
}
}
for asteroidIndex, asteroid in ipairs(asteroids) do
asteroid.angle = love.math.random() * (2 * math.pi)
end
asteroidRadius = 80
end
function love.update(dt)
local turnSpeed = 10
if love.keyboard.isDown('right') then
shipAngle = shipAngle + turnSpeed * dt
end
if love.keyboard.isDown('left') then
shipAngle = shipAngle - turnSpeed * dt
end
shipAngle = shipAngle % (2 * math.pi)
if love.keyboard.isDown('up') then
local shipSpeed = 100
shipSpeedX = shipSpeedX + math.cos(shipAngle) * shipSpeed * dt
shipSpeedY = shipSpeedY + math.sin(shipAngle) * shipSpeed * dt
end
shipX = (shipX + shipSpeedX * dt) % arenaWidth
shipY = (shipY + shipSpeedY * dt) % arenaHeight
local function areCirclesIntersecting(aX, aY, aRadius, bX, bY, bRadius)
return (aX - bX)^2 + (aY - bY)^2 <= (aRadius + bRadius)^2
end
for bulletIndex = #bullets, 1, -1 do
local bullet = bullets[bulletIndex]
bullet.timeLeft = bullet.timeLeft - dt
if bullet.timeLeft <= 0 then
table.remove(bullets, bulletIndex)
else
local bulletSpeed = 500
bullet.x = (bullet.x + math.cos(bullet.angle) * bulletSpeed * dt)
% arenaWidth
bullet.y = (bullet.y + math.sin(bullet.angle) * bulletSpeed * dt)
% arenaHeight
for asteroidIndex = #asteroids, 1, -1 do
local asteroid = asteroids[asteroidIndex]
if areCirclesIntersecting(
bullet.x, bullet.y, bulletRadius,
asteroid.x, asteroid.y, asteroidRadius
) then
table.remove(bullets, bulletIndex)
local angle1 = love.math.random() * (2 * math.pi)
local angle2 = (angle1 - math.pi) % (2 * math.pi)
table.insert(asteroids, {
x = asteroid.x,
y = asteroid.y,
angle = angle1,
})
table.insert(asteroids, {
x = asteroid.x,
y = asteroid.y,
angle = angle2,
})
table.remove(asteroids, asteroidIndex)
break
end
end
end
end
bulletTimer = bulletTimer + dt
if love.keyboard.isDown('s') then
if bulletTimer >= bulletTimerLimit then
bulletTimer = 0
table.insert(bullets, {
x = shipX + math.cos(shipAngle) * shipRadius,
y = shipY + math.sin(shipAngle) * shipRadius,
angle = shipAngle,
timeLeft = 4,
})
end
end
for asteroidIndex, asteroid in ipairs(asteroids) do
local asteroidSpeed = 20
asteroid.x = (asteroid.x + math.cos(asteroid.angle)
* asteroidSpeed * dt) % arenaWidth
asteroid.y = (asteroid.y + math.sin(asteroid.angle)
* asteroidSpeed * dt) % arenaHeight
if areCirclesIntersecting(
shipX, shipY, shipRadius,
asteroid.x, asteroid.y, asteroidRadius
) then
love.load()
break
end
end
end
function love.draw()
for y = -1, 1 do
for x = -1, 1 do
love.graphics.origin()
love.graphics.translate(x * arenaWidth, y * arenaHeight)
love.graphics.setColor(0, 0, 1)
love.graphics.circle('fill', shipX, shipY, shipRadius)
local shipCircleDistance = 20
love.graphics.setColor(0, 1, 1)
love.graphics.circle(
'fill',
shipX + math.cos(shipAngle) * shipCircleDistance,
shipY + math.sin(shipAngle) * shipCircleDistance,
5
)
for bulletIndex, bullet in ipairs(bullets) do
love.graphics.setColor(0, 1, 0)
love.graphics.circle('fill', bullet.x, bullet.y, bulletRadius)
end
for asteroidIndex, asteroid in ipairs(asteroids) do
love.graphics.setColor(1, 1, 0)
love.graphics.circle('fill', asteroid.x, asteroid.y,
asteroidRadius)
end
end
end
end