134 lines
3.4 KiB
Lua
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
|