From 6c1b73d9702ad5304f44c68b7a8ad831c4713c5e Mon Sep 17 00:00:00 2001 From: Simon Kellet Date: Fri, 19 Apr 2024 23:46:04 +0100 Subject: [PATCH] init push --- Daydream.ttf | Bin 0 -> 10764 bytes bullet.lua | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ bullet.png | Bin 0 -> 379 bytes classic.lua | 68 ++++++++++++++++++++++++++++++++++++++++++++++ conf.lua | 6 +++++ drawGame.lua | 49 ++++++++++++++++++++++++++++++++++ enemy.lua | 25 +++++++++++++++++ extra.png | Bin 0 -> 185 bytes green.png | Bin 0 -> 220 bytes keyPressed.lua | 13 +++++++++ main.lua | 47 ++++++++++++++++++++++++++++++++ player.lua | 39 +++++++++++++++++++++++++++ player1.png | Bin 0 -> 190 bytes player2.png | Bin 0 -> 4279 bytes red.png | Bin 0 -> 214 bytes updateGame.lua | 53 ++++++++++++++++++++++++++++++++++++ walls.lua | 32 ++++++++++++++++++++++ yellow.png | Bin 0 -> 220 bytes 18 files changed, 403 insertions(+) create mode 100644 Daydream.ttf create mode 100644 bullet.lua create mode 100644 bullet.png create mode 100644 classic.lua create mode 100644 conf.lua create mode 100644 drawGame.lua create mode 100644 enemy.lua create mode 100644 extra.png create mode 100644 green.png create mode 100644 keyPressed.lua create mode 100644 main.lua create mode 100644 player.lua create mode 100644 player1.png create mode 100644 player2.png create mode 100644 red.png create mode 100644 updateGame.lua create mode 100644 walls.lua create mode 100644 yellow.png diff --git a/Daydream.ttf b/Daydream.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35f12e42e999a83f82d57bcec4aac4778031d356 GIT binary patch literal 10764 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 Vt5;kD1{ec_r>mdKI;VstE&%W-nE(I) literal 0 HcmV?d00001 diff --git a/classic.lua b/classic.lua new file mode 100644 index 0000000..cbd6f81 --- /dev/null +++ b/classic.lua @@ -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 diff --git a/conf.lua b/conf.lua new file mode 100644 index 0000000..7065f0c --- /dev/null +++ b/conf.lua @@ -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 diff --git a/drawGame.lua b/drawGame.lua new file mode 100644 index 0000000..f1d3d72 --- /dev/null +++ b/drawGame.lua @@ -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 diff --git a/enemy.lua b/enemy.lua new file mode 100644 index 0000000..03d1d43 --- /dev/null +++ b/enemy.lua @@ -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 diff --git a/extra.png b/extra.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbf8239249555dac5d67e2bd67456ead0c41111 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<gTe~DWM4fl*c?R literal 0 HcmV?d00001 diff --git a/green.png b/green.png new file mode 100644 index 0000000000000000000000000000000000000000..6f2f4f2f09eb8a4ee20bd285ea992dc41db6f3eb GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYT!3HD~)>;8c2F?PH$YKTtZXpn6ymYtj4^Xhr z)5S3)qV?_cgS-t20xbN=_S+WCO;DYdq#Y&r?|t!29SH^N_sTJwCi5-{>Qa<>-zi&g z=l0YIKU;Uc;oqX*{X*e&jLVZHN@ 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 diff --git a/player1.png b/player1.png new file mode 100644 index 0000000000000000000000000000000000000000..347069d1ebfe88f65e2f1d07f233f1399e78bb68 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^Hb5-L!3HD?X4LuvDb50q$YKTtZXpn6ymYtj4@l0_ z#W5tJ_3e#=ybTHhE*FnhY-fp{cq*6G>H^m_E{g&ML*xIU2mH;r7pA0H++35zY38tD zS8Zwh+xJ&Y3+B5=mP@%s$sc_6rl~#u<;}Oh%opdL_gJkQG57woeYcXoK0OHH$R2#f i5$3+ZYW;(b9}KA*1YIBAIbi^_o59o7&t;ucLK6T|eMm3> literal 0 HcmV?d00001 diff --git a/player2.png b/player2.png new file mode 100644 index 0000000000000000000000000000000000000000..bfaedfbff1dcdd73d9622b6d6555e9c9a7640b24 GIT binary patch literal 4279 zcmeH~e^3)=8pp#?!3MDu@6?LYWvv|A+3aqzfn+Z!Qi2d`Bmq)WI>kK{WfCK($=dMy6@y?DNN1dvtRj*p{?i_pXZUAB0 znHy%>|Ja$$?mq9cpXYhL@AJNsUF%+0oT{Iu*XeYr&Jsr%y4uj0IX(&fhJM>niY~`v z6;(*w>Z7qNN zWfT3%#^mWc`%^M!H2>^C>*DwNE~HKR!&gmj&dtbNKOw*C#HCx?lWi?nY3=?E`}#0ZGTS#{!Mjh)^k~VFlyZ5*606pHMR`Am9fA#RoR>C zxyl_r_u#;PzP)?oztrc4j~}tiuT8s=-SxM`+D%IirTxQ}P1XeES^391f92|$vZ`v) zZ|WWIZ`A1$n#ICGx3jQtuqIT=j)pDvlJ2?FkGyzl9ZsyPORGKZp3!5NbD?UVyIKEs zrSJ6NOD9R+$<6PyTl8(?lJh6;n`rp#FKoMh_4(vi53bp|YyIo@I^XHV`_^1+{J5jP z{nyFkzcrp}ojajd`C`GW3tV=`oVreYRbw-?s&?C=qdT6O^?B`zbKS?zbmW})=ZYIA z9xsz8C$7M2H$1V&^>KmipqR0ve{FYb&c2?@J(IGRZoaqW+PY)Xjub0Q{_f`~v(Ijd+RXeqEWI78xpDDMLP_}xpJbdrpEmVr_ubelk^VpT-@UobvoinX>*2Pn z?T_3;y%!Tvk5#!Au)Gv7072rQAsPsw=0p9M9}NM%1}Yc_y<*Ug-|XnbF;TGNFPL4F zD^v)5Vo59v%VP^G_*e~Z74ZCL^tLFA00F1~EE@0!Wj1QZH7<+pRWpfWnu}6n$E#d! ztWXL=j4?0OdJ!T6F9=6OeZvcUw?6^-+LM%x}A`wHxWRSvMlD1l{BxNLx zMgn;da(z$%Q6ebMR1tB81Im0@3@M@%#8f8Wq~(eo$I&=8m|q~|at+~w@_-6R4>Afu zByFI`K!6^NKlp}RftD&+24!h^n1@AmFsRHNjwp7z+(QJlB(E3J6 z;+LyIoen#$=F18aFAA)7O98-HEglm=@d8IMCYmDvlV>4}G!4zPiKZ-O<1mynC@Uby zLluSK1`%=ctR|l4fIt8$*Gw=f%*t3P0&)~%Hs_jhDZmdyl!isrmB2qdD-|Um6b~4V z=4eO&&O{>=WhN{ZqlJK04${yl@Mb!WQs;p!a69d|(LiZ%&Eob0#Uq6ScH9McthD^$ zNQD@Hn9UEJDq&bg9j8KR%3#XXMg*RnhmZhuju-%5NQQ!5 zZ9ttD7FC0k1!|)rvSvrcu!Ug=6e(OGNq#%7riQ7=p1 zL0eg)i8Yy?rf8NL<}V4Nr~dzWtE&gI#pk?4lu`V8%@ki!<*+vX6o2%K+FHUeZB?*< zkCz~WIw)v)B368e_ko}nqU~d#UkB~t5A}kP@mQ<^O_=lYAi;oKD*?=$nJ`(bRu6AB z8F`u+NtY#$5&>aY;6*wjtx$hzT46cyDV#mhJ>rAv{2;{$iXpzQ7&%ZesqPwsCELjF ziDJ_nhHW$Gy|@i+UuZWZhql83(bSFSCp-ow<0p)O&|^VHrSF(rV{(m3fl)b+b=R0& zqf%g0&STy6qsgUz_(27O=xD|YBM>5RIj$nH!9Sso3QERuD) zlyvn>IC-w|J~AdNPFGR#l}FOjr(_*T&pL`si=B>wimL9f`wpkB!qSQg`dY4U&~Nxf z?>0glH@$>OhH2uRjgoMO_W99RAGAqC1&s-ZnB`GQC!Oi)dr>~st l?>qf+Q&Us<>RC=xzmA!wmwZi^eJF~~S+vm6_H6a){{cM`0NMZm literal 0 HcmV?d00001 diff --git a/red.png b/red.png new file mode 100644 index 0000000000000000000000000000000000000000..04efa8a377786abb020df45d2c47130399264cf4 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYT!3HD~)>;8c2F?PH$YKTtZXpn6ymYtj4^Xhf z)5S3)qV?@`N3I3~9+u#bZ?0dN{_6S{=C5)K6K{$I-PkF1=>T7JRMy&QGgZHqMQvct zHhE-wZsDZ7@1ar8izcZ4ZQ3s<^ERfXJV^ literal 0 HcmV?d00001 diff --git a/updateGame.lua b/updateGame.lua new file mode 100644 index 0000000..094a22d --- /dev/null +++ b/updateGame.lua @@ -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 diff --git a/walls.lua b/walls.lua new file mode 100644 index 0000000..68a68eb --- /dev/null +++ b/walls.lua @@ -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 diff --git a/yellow.png b/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..4055b3dbff7c41d32667ae8864f29cb24088fe4b GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^8bGYT!3HD~)>;8c2F?PH$YKTtZXpn6ymYtj4^Xhr z)5S3)qV?_cgS-t2Jg(h^^6mw!bFYY&Fwf;U|BWHj&b0MU`LYX7_M50aowM{v@!R># zr>mAEIkLX475;QXeuLwbRn1bXomU+0kyu*KzSVi{Lzyqj?Af!=Wv1^rZ=5vc2j9Kt z&#ayYNEn`~D83+l?%=ha{rpk?RjyUJ^$6`dcrz;D@Aatf?!3xwop%>>?6J~uQ(u14 Qsutv4Pgg&ebxsLQ0KcSGc>n+a literal 0 HcmV?d00001