From 3c9ccdebcd2ea18fe99476e1f7b95dfcc6d93264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Struha=CC=81r?= Date: Mon, 2 Sep 2024 19:47:49 +0200 Subject: [PATCH] Game finished --- README.md | 12 +++ impact.ogg | Bin 0 -> 6381 bytes impact_player.ogg | Bin 0 -> 6575 bytes impact_wall.ogg | Bin 0 -> 12084 bytes jirka.png | Bin 0 -> 18588 bytes main.lua | 254 ++++++++++++++++++++++++++++++++++++++++++++++ run.sh | 6 ++ 7 files changed, 272 insertions(+) create mode 100644 README.md create mode 100644 impact.ogg create mode 100644 impact_player.ogg create mode 100644 impact_wall.ogg create mode 100644 jirka.png create mode 100644 main.lua create mode 100755 run.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..4741751 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# Atari Breakout clone + +A game made on gamedev dungeon over ~1.5 hours + +## Assets - credits + +- Sounds by Kenney ([link](https://kenney.nl/assets/impact-sounds)) +- Jirka image stolen from Garrigue games discord + +--- + +Vojtěch Struhár, 2.9.2024 diff --git a/impact.ogg b/impact.ogg new file mode 100644 index 0000000000000000000000000000000000000000..88359d14164c6df85d8f31b6227d49b274d208e3 GIT binary patch literal 6381 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 literal 0 HcmV?d00001 diff --git a/impact_player.ogg b/impact_player.ogg new file mode 100644 index 0000000000000000000000000000000000000000..97735ff813cdd1b3825e06a927a32e5e83eed9b2 GIT binary patch literal 6575 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 literal 0 HcmV?d00001 diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..969c4b1 --- /dev/null +++ b/main.lua @@ -0,0 +1,254 @@ +player = { + position = { x = 0, y = 0 }, + width = 100, + height = 10, + moving_left = false, + moving_right = false, + -- Returns 2 values, x and y! + getCenter = function() + return player.position.x + player.width / 2, player.position.y + player.height / 2 + end +} + +settings = { + player_speed = 8, + ball_speed = 5, + + block_rows = 1, + block_cols = 3, + + block_height = 15, + block_offset_x = 30, + block_offset_y = 80, + block_gap = 5, + + collision_margin = 2 -- kinda tied to ball radius lol +} + +game = { + ball = { + position = { x = 0, y = 0 }, + velocity = { dx = 0, dy = 0 }, + radius = 5 + }, + score = 0, + -- Array of breakable blocks, generated on load! + blocks = {}, + is_playing = true, +} + +media = {} + +function love.load() + media.jirka = love.graphics.newImage("jirka.png") + media.impact = love.audio.newSource("impact.ogg", "static") + media.impact_wall = love.audio.newSource("impact_wall.ogg", "static") + media.impact_player = love.audio.newSource("impact_player.ogg", "static") + + -- place the player + player.position.x = love.graphics.getWidth() / 2 + player.position.y = love.graphics.getHeight() - 30 + + -- place the ball + local px, py = player.getCenter() + game.ball.position.x = px + game.ball.position.y = py - player.height + game.ball.velocity.dx = (love.math.random() - 0.5) * settings.ball_speed + game.ball.velocity.dy = -settings.ball_speed + + -- Setup block variables + local cur_x = settings.block_offset_x + local cur_y = settings.block_offset_y + local gap = settings.block_gap + local block_width = (love.graphics.getWidth() - cur_x * 2 - gap * (settings.block_cols - 1)) / settings.block_cols + -- Generate the actual blocks + for row = 1, settings.block_rows do + for col = 1, settings.block_cols do + table.insert(game.blocks, { + x = cur_x, + y = cur_y, + width = block_width, + height = settings.block_height, + color = { + r = math.max(love.math.random(), 0.2), + g = math.max(love.math.random(), 0.2), + b = math.max(love.math.random(), 0.2) + }, + active = true -- This is turned off when a box is hit + }) + cur_x = cur_x + block_width + gap + end + cur_y = cur_y + settings.block_height + gap + cur_x = settings.block_offset_x + end +end + +function love.update() + if game.is_playing == false then + return + end + + if player.moving_left then + player.position.x = player.position.x - settings.player_speed + end + if player.moving_right then + player.position.x = player.position.x + settings.player_speed + end + + local b = game.ball + + -- move ball + b.position.x = b.position.x + b.velocity.dx + b.position.y = b.position.y + b.velocity.dy + + -- Check wall collisions + if b.position.x <= settings.collision_margin then + b.velocity.dx = -b.velocity.dx + media.impact_wall:stop() + media.impact_wall:play() + end + if b.position.x >= love.graphics.getWidth() - settings.collision_margin then + b.velocity.dx = -b.velocity.dx + media.impact_wall:stop() + media.impact_wall:play() + end + if b.position.y <= settings.collision_margin then + -- ceiling hit + b.velocity.dy = -b.velocity.dy + media.impact_wall:stop() + media.impact_wall:play() + end + + -- player collision + local player_block = { + x = player.position.x, + y = player.position.y, + width = player.width, + height = player.height + } + if checkCollision(player_block, game.ball) then + media.impact_player:play() + b.velocity.dy = -b.velocity.dy + local cx, cy = player.getCenter() + local distance_from_center = b.position.x - cx + game.ball.velocity.dx = (distance_from_center / (player.width / 2)) * settings.ball_speed + end + + + -- Check box collisions + for _, block in ipairs(game.blocks) do + if block.active then + local dist_x = block.x - b.position.x + local dist_y = block.y - b.position.y + if checkCollision(block, game.ball) then + block.active = false + media.impact:stop() + media.impact:play() + + game.score = game.score + 1 + + -- block hit horizontal + if b.position.x > (block.x + block.width) or b.position.x < block.x then + b.velocity.dx = -b.velocity.dx + else -- b.position.y > (block.y + block.height) or b.position.y < block.y then + b.velocity.dy = -b.velocity.dy + end + end + end + end + + -- GAME OVER + if b.position.y > love.graphics.getHeight() then + love.event.quit(0) + end + + -- WIN GAME?? + if game.score == #game.blocks then + game.is_playing = false + end +end + +function love.draw() + if game.is_playing == false then + love.graphics.clear(0.1, 0.9, 0.3, 1) + love.graphics.setColor(0, 0, 0, 1) + love.graphics.print("YOU WON! GOOD JOB!", love.graphics.getWidth() / 2, love.graphics.getHeight() / 2) + love.graphics.print( + "Press space to play again", love.graphics.getWidth() / 2, (love.graphics.getHeight() / 2) + 30 + ) + love.graphics.setColor(255, 255, 255, 255) -- white? + love.graphics.draw(media.jirka, + (love.graphics.getWidth() / 2) - 150, + (love.graphics.getHeight() / 2) - 70) + + return + end + love.graphics.setColor(1, 1, 1, 1) -- white + love.graphics.clear() + + love.graphics.print("Score: " .. tostring(game.score), 10, 10) + + love.graphics.rectangle("fill", player.position.x, player.position.y, player.width, player.height) + + -- draw the ball + love.graphics.circle("fill", game.ball.position.x, game.ball.position.y, game.ball.radius) + + -- draw the blocks + for _, block in ipairs(game.blocks) do + if block.active then + love.graphics.setColor(block.color.r, block.color.g, block.color.b) + love.graphics.rectangle("fill", block.x, block.y, block.width, block.height, 4, 4) + end + end +end + +-- INPUT HANDLING + +function love.keypressed(key) + if key == "left" or key == "a" then + player.moving_left = true + end + if key == "right" or key == "d" then + player.moving_right = true + end +end + +function love.keyreleased(key) + if key == "left" or key == "a" then + player.moving_left = false + end + if key == "right" or key == "d" then + player.moving_right = false + end + + if game.is_playing == false and key == "space" then + resetGame() + game.is_playing = true + end +end + +-- UTILS + +function checkCollision(box, ball) + local closestX = math.max(box.x, math.min(ball.position.x, box.x + box.width)) + local closestY = math.max(box.y, math.min(ball.position.y, box.y + box.height)) + + local distanceX = ball.position.x - closestX + local distanceY = ball.position.y - closestY + + local distanceSquared = (distanceX * distanceX) + (distanceY * distanceY) + + return distanceSquared < (ball.radius * ball.radius) +end + +function resetGame() + -- Remove all blocks + for k in pairs(game.blocks) do + game.blocks[k] = nil + end + -- reset score + game.score = 0 + + -- Reload + love.load() +end diff --git a/run.sh b/run.sh new file mode 100755 index 0000000..6156cdc --- /dev/null +++ b/run.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +# `love` here is the Love2D executable (installed with homebrew, so it's linked) +# https://www.love2d.org/wiki/Getting_Started + +open -n -a love "/Users/vojtechstruhar/Development/LuaProjects/love-gdungeon"