init push

This commit is contained in:
Simon Kellet 2024-04-19 23:46:04 +01:00
parent 30654aa7fc
commit 6c1b73d970
18 changed files with 403 additions and 0 deletions

BIN
Daydream.ttf Normal file

Binary file not shown.

71
bullet.lua Normal file
View File

@ -0,0 +1,71 @@
Bullet = Object:extend()
function Bullet:new(x, y, p, image)
self.image = love.graphics.newImage(image)
self.x = x
self.y = y
self.p = p
self.width = self.image:getWidth()
self.height = self.image:getHeight()
end
function Bullet:update(dt)
--if bullet belongs to player 1, travel upwards
if self.p == 1 then
self.y = self.y - (500 * dt)
--if bullet belongs to player 2, travel downwards
elseif self.p == 2 then
self.y = self.y + (500 * dt)
end
--check if the bullet has hit a player
if self.p == 1 then
if
self.x < UserPlayer2.x + UserPlayer2.width
and UserPlayer2.x < self.x + self.width
and self.y < UserPlayer2.y + UserPlayer2.height
and UserPlayer2.y < self.y + self.height
then
UserPlayer2.health = UserPlayer2.health - 1
Bullets1 = {}
end
end
--check if the bullet has hit a player
if self.p == 2 then
if
self.x < UserPlayer1.x + UserPlayer1.width
and UserPlayer1.x < self.x + self.width
and self.y < UserPlayer1.y + UserPlayer1.height
and UserPlayer1.y < self.y + self.height
then
UserPlayer1.health = UserPlayer1.health - 1
Bullets2 = {}
end
end
--check if the bullet has hit a wall
for i, v in ipairs(Walls) do
if self.x < v.x + v.w and v.x < self.x + self.width and self.y < v.y + v.h and v.y < self.y + self.height then
if self.p == 1 then
Bullets1 = {}
elseif self.p == 2 then
Bullets2 = {}
end
end
end
end
function Bullet:clear()
Bullets1 = {}
Bullets2 = {}
end
function Bullet:draw()
for _, v in ipairs(Bullets1) do
love.graphics.draw(self.image, self.x, self.y)
end
for _, v in ipairs(Bullets2) do
love.graphics.draw(self.image, self.x, self.y)
end
end

BIN
bullet.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

68
classic.lua Normal file
View File

@ -0,0 +1,68 @@
--
-- classic
--
-- Copyright (c) 2014, rxi
--
-- This module is free software; you can redistribute it and/or modify it under
-- the terms of the MIT license. See LICENSE for details.
--
local Object = {}
Object.__index = Object
function Object:new()
end
function Object:extend()
local cls = {}
for k, v in pairs(self) do
if k:find("__") == 1 then
cls[k] = v
end
end
cls.__index = cls
cls.super = self
setmetatable(cls, self)
return cls
end
function Object:implement(...)
for _, cls in pairs({...}) do
for k, v in pairs(cls) do
if self[k] == nil and type(v) == "function" then
self[k] = v
end
end
end
end
function Object:is(T)
local mt = getmetatable(self)
while mt do
if mt == T then
return true
end
mt = getmetatable(mt)
end
return false
end
function Object:__tostring()
return "Object"
end
function Object:__call(...)
local obj = setmetatable({}, self)
obj:new(...)
return obj
end
return Object

6
conf.lua Normal file
View File

@ -0,0 +1,6 @@
function love.conf(t)
t.window.width = 1280
t.window.height = 720
t.window.title = "Space Invaders"
t.window.icon = "green.png"
end

49
drawGame.lua Normal file
View File

@ -0,0 +1,49 @@
function DrawGameOver()
local s = ""
if HasP1Won then
s = "Player 1 Wins"
elseif HasP2Won then
s = "Player 2 Wins"
end
local sw, sh = GameFont:getWidth(s), GameFont:getHeight(s)
local centreX = love.graphics.getWidth() / 2
local centreY = love.graphics.getHeight() / 2
love.graphics.print(s, centreX - sw / 2, centreY - sh / 2)
end
function DisplayHealth()
local height = love.graphics.getHeight()
local width = love.graphics.getWidth()
love.graphics.print("" .. UserPlayer1.health, width - 120, height - 120)
love.graphics.print("" .. UserPlayer2.health, 0, 0)
end
function drawGame()
-- Debug Info
love.graphics.setColor(1, 1, 1) -- RGB values for white are (1, 1, 1)
love.graphics.setFont(DebugFont)
love.graphics.print("FPS: " .. love.timer.getFPS(), 1200, 10)
--
love.graphics.setFont(GameFont)
--love.graphics.print("" .. TimeToPlaceWall, 300, 500)
DisplayHealth()
DrawGameOver()
-- Bullets Draw
for _, v in ipairs(Bullets1) do
v:draw()
end
for _, v in ipairs(Bullets2) do
v:draw()
end
-- Players Draw
UserPlayer1:draw()
UserPlayer2:draw()
-- Walls Draw
for _, v in ipairs(Walls) do
v:draw()
end
end

25
enemy.lua Normal file
View File

@ -0,0 +1,25 @@
Enemy = Object:extend()
function Enemy:new(x, y, image, speed)
self.image = love.graphics.newImage(image)
self.x = x
self.y = y
self.speed = speed
self.width = self.image:getWidth()
self.height = self.image:getHeight()
end
function Enemy:update(dt)
--check if enemy has touched the wall and bouce back
if self.x < 0 then
self.x = 0
self.speed = -self.speed
elseif self.x + self.width > love.graphics.getWidth() then
self.x = love.graphics.getWidth() - self.width
self.speed = -self.speed
end
end
function Enemy:draw()
love.graphics.draw(self.image, self.x, self.y)
end

BIN
extra.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

BIN
green.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

13
keyPressed.lua Normal file
View File

@ -0,0 +1,13 @@
function keyPressed(key)
if key == "space" then
local bullet = Bullet(UserPlayer1.x + UserPlayer1.width / 2, UserPlayer1.y, 1, "bullet.png", 500)
table.insert(Bullets1, bullet)
elseif key == "return" then
local bullet = Bullet(UserPlayer2.x + UserPlayer2.width / 2, UserPlayer2.y, 2, "bullet.png", 500)
table.insert(Bullets2, bullet)
elseif key == "escape" then
love.event.quit()
elseif key == "r" then
love.load()
end
end

47
main.lua Normal file
View File

@ -0,0 +1,47 @@
function love.load()
-- Objects, classes
Object = require("classic")
require("player")
require("bullet")
require("walls")
-- Lua files for the game
require("updateGame")
require("drawGame")
require("keyPressed")
love.math.setRandomSeed(os.time())
GameFont = love.graphics.newFont("Daydream.ttf", 60)
DebugFont = love.graphics.newFont("Daydream.ttf", 12)
love.graphics.setFont(GameFont)
ScrnHeight = love.graphics.getHeight()
ScrnWidth = love.graphics.getWidth()
UserPlayer1 = Player(400, ScrnHeight - 30, 1, 3, "player1.png", 300)
UserPlayer2 = Player(200, 0, 2, 3, "player2.png", 300)
Bullets1 = {}
Bullets2 = {}
Walls = {}
TIMER = 10
TimeToPlaceWall = TIMER
HasP1Won = false
HasP2Won = false
end
function love.keypressed(key)
keyPressed(key)
end
function love.update(dt)
updateGame(dt)
end
function love.draw()
drawGame()
end

39
player.lua Normal file
View File

@ -0,0 +1,39 @@
Player = Object:extend()
function Player:new(x, y, p, health, image, speed)
self.image = love.graphics.newImage(image)
self.x = x
self.y = y
self.p = p
self.health = health
self.speed = speed
self.width = self.image:getWidth()
self.height = self.image:getHeight()
end
function Player:update(dt)
if self.p == 1 then
if love.keyboard.isDown("d") then
self.x = self.x + (self.speed * dt)
elseif love.keyboard.isDown("a") then
self.x = self.x - (self.speed * dt)
end
elseif self.p == 2 then
if love.keyboard.isDown("right") then
self.x = self.x + (self.speed * dt)
elseif love.keyboard.isDown("left") then
self.x = self.x - (self.speed * dt)
end
end
--check if player is out of bounds
if self.x < 0 then
self.x = 0
elseif self.x + self.width > love.graphics.getWidth() then
self.x = love.graphics.getWidth() - self.width
end
end
function Player:draw()
love.graphics.draw(self.image, self.x, self.y)
end

BIN
player1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

BIN
player2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
red.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

53
updateGame.lua Normal file
View File

@ -0,0 +1,53 @@
function CheckHealth(p1, p2)
if p1.health == 0 then
HasP2Won = true
elseif p2.health == 0 then
HasP1Won = true
end
end
function updateGame(dt)
TimeToPlaceWall = TimeToPlaceWall - dt
if TimeToPlaceWall <= 0 then
--place a wall at a random location
local ranx = love.math.random(100, 1000)
local rany = love.math.random(100, 600)
local ranw = love.math.random(100, 500)
local ranh = love.math.random(20, 80)
local lifetime = love.math.random(4, 10)
local wall = Wall(ranx, rany, ranw, ranh, lifetime)
table.insert(Walls, wall)
TimeToPlaceWall = TIMER --reset the timer
end
-- Walls Updates
for i, v in ipairs(Walls) do
v:update(dt)
end
-- Check the players health
CheckHealth(UserPlayer1, UserPlayer2)
-- Bullets Updates
for i, v in ipairs(Bullets1) do
v:update(dt)
if v.y < 0 then --top of screen
table.remove(Bullets1, i)
elseif v.y > love.graphics.getHeight() then --bottom of screen
table.remove(Bullets1, i)
end
end
for i, v in ipairs(Bullets2) do
v:update(dt)
if v.y < 0 then --top of screen
table.remove(Bullets2, i)
elseif v.y > love.graphics.getHeight() then --bottom of screen
table.remove(Bullets2, i)
end
end
-- Player Updates
UserPlayer1:update(dt)
UserPlayer2:update(dt)
end

32
walls.lua Normal file
View File

@ -0,0 +1,32 @@
Wall = Object:extend()
function Wall:new(x, y, w, h, lifetime)
self.x = x
self.y = y
self.w = w --width of wall
self.h = h --height of wall
self.lifetime = lifetime
end
function lerp(a, b, t)
return a + (b - a) * t
end
function Wall:update(dt)
--slowly decrease the lifetime of the wall
self.lifetime = self.lifetime - dt
--delete wall after lifetime is up
if self.lifetime <= 0 then
for i, v in ipairs(Walls) do
if v == self then --if the wall is the same as the wall we want to delete
table.remove(Walls, i)
end
end
end
end
function Wall:draw()
local rectangleColor = { 1, 0, 0 } -- Starting color (red)
love.graphics.setColor(rectangleColor) --white
love.graphics.rectangle("fill", self.x, self.y, self.w, self.h)
end

BIN
yellow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B