Initial Commit
This commit is contained in:
commit
16a6ac9b06
BIN
assets/background.jpg
Normal file
BIN
assets/background.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 668 KiB |
BIN
assets/bullet.png
Normal file
BIN
assets/bullet.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 315 B |
BIN
assets/character.png
Normal file
BIN
assets/character.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
assets/zombie.png
Normal file
BIN
assets/zombie.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
249
main.lua
Normal file
249
main.lua
Normal file
@ -0,0 +1,249 @@
|
||||
--[[ LOVE STUFF ]]
|
||||
function love.load()
|
||||
maxTime = 0
|
||||
timer = 0
|
||||
score = 0
|
||||
|
||||
gameState = "menu"
|
||||
|
||||
sprites = {}
|
||||
sprites.player = love.graphics.newImage('assets/character.png')
|
||||
sprites.bullet = love.graphics.newImage('assets/bullet.png')
|
||||
sprites.zombie = love.graphics.newImage('assets/zombie.png')
|
||||
sprites.background = love.graphics.newImage('assets/background.jpg')
|
||||
|
||||
player = {}
|
||||
player.speed = 180
|
||||
player.sprite = sprites.player
|
||||
|
||||
zombies = {}
|
||||
bullets = {}
|
||||
|
||||
killableTables = {bullets, zombies}
|
||||
end
|
||||
|
||||
function love.update(dt)
|
||||
if gameState == "game" then
|
||||
movePlayer(dt)
|
||||
moveZombie(dt)
|
||||
moveBullet(dt)
|
||||
|
||||
checkCollisions(dt)
|
||||
cleanUp(dt)
|
||||
timer = timer - dt
|
||||
if timer <= 0 then
|
||||
spawnZombie()
|
||||
maxTime = maxTime * 0.95
|
||||
timer = maxTime
|
||||
end
|
||||
end
|
||||
if gameState == "menu" then
|
||||
love.graphics.setColor(255, 255, 255)
|
||||
love.graphics.setFont(love.graphics.newFont(40))
|
||||
love.graphics.printf("Click anywhere to begin", 0, 50, love.graphics.getWidth(), "center")
|
||||
end
|
||||
end
|
||||
|
||||
function love.draw()
|
||||
if gameState == "game" then
|
||||
love.graphics.draw(sprites.background, 0, 0)
|
||||
drawPlayer()
|
||||
drawZombies()
|
||||
drawBullets()
|
||||
love.graphics.setFont(love.graphics.newFont(20))
|
||||
love.graphics.print("Score:" .. score)
|
||||
end
|
||||
end
|
||||
|
||||
function love.mousepressed(x, y, button, isTouch)
|
||||
if button == 1 then
|
||||
if gameState == "game" then
|
||||
spawnBullet()
|
||||
end
|
||||
if gameState == "menu" then
|
||||
newGame()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--[[ GENERAL ]]
|
||||
function newGame()
|
||||
score = 0
|
||||
player.x = love.graphics.getWidth()/2
|
||||
player.y = love.graphics.getHeight()/2
|
||||
clearZombies()
|
||||
gameState = "game"
|
||||
maxTime = 2
|
||||
timer = maxTime
|
||||
end
|
||||
|
||||
|
||||
function checkCollisions(dt)
|
||||
-- zombies and player
|
||||
for i,z in ipairs(zombies) do
|
||||
if distanceBetweenObjects(z, player) < 30 then
|
||||
gameState = "menu" -- gameover
|
||||
end
|
||||
end
|
||||
-- zombies and bullets
|
||||
for i,z in ipairs(zombies) do
|
||||
for j,b in ipairs(bullets) do
|
||||
if distanceBetweenObjects(z, b) < 30 then
|
||||
z.dead = true
|
||||
b.dead = true
|
||||
score = score + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function cleanUp(dt)
|
||||
for x, t in ipairs(killableTables) do
|
||||
for i=#t, 1, -1 do
|
||||
if t[i].dead == true then
|
||||
table.remove(t, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--[[ PLAYER ]]
|
||||
function drawPlayer()
|
||||
love.graphics.draw(
|
||||
player.sprite,
|
||||
player.x, player.y,
|
||||
player.rotation,
|
||||
nil, nil,
|
||||
15.5, 21.5
|
||||
)
|
||||
end
|
||||
|
||||
function movePlayer(dt)
|
||||
player.rotation = radians_between({["x"] = love.mouse.getX(), ["y"] = love.mouse.getY()}, player)
|
||||
|
||||
if love.keyboard.isDown('s') then
|
||||
player.y = player.y + player.speed * dt
|
||||
end
|
||||
if love.keyboard.isDown('w') then
|
||||
player.y = player.y - player.speed * dt
|
||||
end
|
||||
|
||||
if love.keyboard.isDown('a') then
|
||||
player.x = player.x - player.speed * dt
|
||||
end
|
||||
if love.keyboard.isDown('d') then
|
||||
player.x = player.x + player.speed * dt
|
||||
end
|
||||
player.x = math.Clamp(0, player.x, love.graphics.getWidth())
|
||||
player.y = math.Clamp(0, player.y, love.graphics.getHeight())
|
||||
end
|
||||
|
||||
--[[ ZOMBIE STUFF ]]
|
||||
function drawZombies()
|
||||
for i,z in ipairs(zombies) do
|
||||
love.graphics.draw(
|
||||
z.sprite,
|
||||
z.x, z.y,
|
||||
radians_between(player, z),
|
||||
nil, nil,
|
||||
z.sprite:getWidth()/2, z.sprite:getHeight()/2
|
||||
)
|
||||
end
|
||||
end
|
||||
function spawnZombie()
|
||||
zombie = {}
|
||||
zombie.x = math.random(0, love.graphics.getWidth())
|
||||
zombie.y = math.random(0, love.graphics.getHeight())
|
||||
zombie.dead = false
|
||||
zombie.speed = 100
|
||||
zombie.sprite = sprites.zombie
|
||||
|
||||
local side = math.random(1, 4)
|
||||
if side == 1 then
|
||||
zombie.x = -30
|
||||
elseif side == 2 then
|
||||
zombie.y = -30
|
||||
elseif side == 3 then
|
||||
zombie.x = love.graphics.getWidth() + 30
|
||||
elseif side == 4 then
|
||||
zombie.y = love.graphics.getHeight() + 30
|
||||
end
|
||||
|
||||
table.insert(zombies, zombie)
|
||||
end
|
||||
|
||||
function moveZombie(dt)
|
||||
for i,z in ipairs(zombies) do
|
||||
radians = radians_between(player, z)
|
||||
z.x = z.x + math.cos(radians) * z.speed * dt
|
||||
z.y = z.y + math.sin(radians) * z.speed * dt
|
||||
end
|
||||
end
|
||||
|
||||
function clearZombies()
|
||||
for i=#zombies, 1, -1 do
|
||||
table.remove(zombies, i)
|
||||
end
|
||||
end
|
||||
--[[ BULLET ]]
|
||||
function spawnBullet()
|
||||
bullet = {}
|
||||
bullet.x = player.x
|
||||
bullet.y = player.y
|
||||
bullet.dead = false
|
||||
bullet.speed = 500
|
||||
bullet.sprite = sprites.bullet
|
||||
bullet.direction = player.rotation
|
||||
|
||||
table.insert(bullets, bullet)
|
||||
end
|
||||
|
||||
function drawBullets()
|
||||
for i, b in ipairs(bullets) do
|
||||
love.graphics.draw(
|
||||
b.sprite,
|
||||
b.x, b.y,
|
||||
b.direction,
|
||||
0.5, 0.5,
|
||||
b.sprite:getWidth()/2, b.sprite:getHeight()/2
|
||||
)
|
||||
-- 46, 31
|
||||
end
|
||||
end
|
||||
|
||||
function moveBullet(dt)
|
||||
for i, b in ipairs(bullets) do
|
||||
b.x = b.x + math.cos(b.direction) * b.speed * dt
|
||||
b.y = b.y + math.sin(b.direction) * b.speed * dt
|
||||
end
|
||||
|
||||
for i=#bullets, 1, -1 do
|
||||
local b = bullets[i]
|
||||
if b.x < 0 or b.x > love.graphics.getWidth() or b.y < 0 or b.y > love.graphics.getHeight() then
|
||||
table.remove(bullets, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--[[ MATH STUFF ]]
|
||||
|
||||
function distanceBetweenObjects(obj1, obj2)
|
||||
return distanceBetween(obj1.x, obj1.y, obj2.x, obj2.y)
|
||||
end
|
||||
|
||||
function distanceBetween(x1, y1, x2, y2)
|
||||
return math.sqrt((y2 - y1)^2 + (x2 - x1)^2)
|
||||
end
|
||||
|
||||
function radians_between(me, target)
|
||||
return math.atan2(me.y - target.y, me.x - target.x)
|
||||
end
|
||||
|
||||
|
||||
function math.Clamp(lower, val, upper)
|
||||
assert(val and lower and upper, "not very useful error message here")
|
||||
if lower > upper then lower, upper = upper, lower end -- swap if boundaries supplied the wrong way
|
||||
return math.max(lower, math.min(upper, val))
|
||||
end
|
Loading…
Reference in New Issue
Block a user