Files
SE_Exam/lua/Flappy.lua
2025-01-22 00:16:29 +01:00

134 lines
3.4 KiB
Lua

-- Flappy Bird Clone using GameEngine
local vector2 = require("vector2")
local utils = require("utils")
-- Game Variables
local bird = {
position = vector2.new(100, 200),
width = 30,
height = 30,
velocity = 0,
jumpStrength = -8
}
local gravity = 0.5
local pipes = {}
local pipeWidth = 60
local pipeGap = 120
local pipeSpeed = 2
local score = 0
local gameRunning = true
local gameStarted = false
local screenWidth = GameEngine:getWidth()
local screenHeight = GameEngine:getHeight()
-- Function to spawn new pipes
local function spawnPipe()
--GameEngine:messageBox(tostring(screenHeight - pipeGap - 50))
local pipeHeight = math.random(50, screenHeight - pipeGap - 50)
--local pipeHeight =50
table.insert(pipes, { x = screenWidth, y = pipeHeight })
end
function setup_window()
GameEngine:setTitle("BreakOut")
GameEngine:setWidth(800)
GameEngine:setHeight(600)
GameEngine:setFrameRate(60)
end
--- the set_keylist function
--- @return string
function set_keylist()
return "R "
end
--- the start function
--- @return nil
function start()
screenWidth = GameEngine:getWidth()
screenHeight = GameEngine:getHeight()
-- print(GameEngine:getRequest("https://dummyjson.com/c/3029-d29f-4014-9fb4"))
end
-- Update game state
function update()
if not gameRunning then return end
-- Apply gravity
bird.velocity = bird.velocity + gravity
bird.position.y = bird.position.y + bird.velocity
-- Jumping mechanic
if GameEngine:isKeyDown(" ") then
bird.velocity = bird.jumpStrength
end
-- Move pipes
for i = #pipes, 1, -1 do
pipes[i].x = pipes[i].x - pipeSpeed
-- Remove off-screen pipes
if pipes[i].x + pipeWidth < 0 then
table.remove(pipes, i)
score = score + 1
end
end
-- Collision detection
for _, pipe in ipairs(pipes) do
if bird.position.x < pipe.x + pipeWidth and bird.position.x + bird.width > pipe.x then
if bird.position.y < pipe.y or bird.position.y + bird.height > pipe.y + pipeGap then
gameRunning = false
end
end
end
-- Check if bird hits ground or ceiling
if bird.position.y + bird.height >= screenHeight or bird.position.y <= 0 then
gameRunning = false
end
-- Spawn pipes periodically
if #pipes == 0 or pipes[#pipes].x < screenWidth - 200 then
spawnPipe()
end
end
-- Draw game elements
function draw()
-- Clear screen
GameEngine:fillScreen(Color.new(135, 206, 250)) -- Sky Blue background
-- Draw bird
GameEngine:setColor(Color.new(255, 255, 0)) -- Yellow
GameEngine:fillOval(bird.position.x, bird.position.y, bird.width, bird.height)
-- Draw pipes
GameEngine:setColor(Color.new(0, 255, 0)) -- Green
for _, pipe in ipairs(pipes) do
GameEngine:fillRect(pipe.x, 0, pipeWidth, pipe.y)
GameEngine:fillRect(pipe.x, pipe.y + pipeGap, pipeWidth, screenHeight - pipe.y - pipeGap)
end
-- Draw score
GameEngine:setColor(Color.new(255, 255, 255)) -- White
GameEngine:drawText(tostring(score), 10, 10)
-- Game over message
if not gameRunning then
GameEngine:drawText("Game Over! Press R to restart", screenWidth / 2 - 80, screenHeight / 2)
end
end
-- Restart function
function restart()
bird.position.y = 200
bird.velocity = 0
pipes = {}
score = 0
gameRunning = true
end