Finish the prototype
This commit is contained in:
commit
4c10718289
234
main.lua
Normal file
234
main.lua
Normal file
@ -0,0 +1,234 @@
|
||||
-- main.lua
|
||||
|
||||
-- Constants
|
||||
local TILE_SIZE = 40
|
||||
local SCREEN_WIDTH = 800
|
||||
local SCREEN_HEIGHT = 600
|
||||
local MOV_COOLDOWN = 0.2
|
||||
local EXPLOSION_TIMEOUT = 0.1
|
||||
|
||||
-- Player state
|
||||
local player = {
|
||||
x = 5 * TILE_SIZE,
|
||||
y = 5 * TILE_SIZE,
|
||||
speed = TILE_SIZE,
|
||||
bombTimer = 0,
|
||||
maxBombs = 2,
|
||||
bombCount = 0,
|
||||
bombSize = 1,
|
||||
}
|
||||
|
||||
-- Box state
|
||||
local boxes = {}
|
||||
|
||||
-- Bomb state
|
||||
local bombs = {}
|
||||
|
||||
-- Explosions state
|
||||
local explosions = {}
|
||||
|
||||
local time = 1
|
||||
|
||||
local function search_box(x, y)
|
||||
for i, box in ipairs(boxes) do
|
||||
if box.x == x and box.y == y then
|
||||
return i
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
local function search_bomb(x, y)
|
||||
for i, bomb in ipairs(bombs) do
|
||||
if bomb.x == x and bomb.y == y then
|
||||
return i
|
||||
end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
local function generate_box()
|
||||
local x = math.random(0, SCREEN_WIDTH / TILE_SIZE - 1) * TILE_SIZE
|
||||
local y = math.random(0, SCREEN_HEIGHT / TILE_SIZE - 1) * TILE_SIZE
|
||||
local count = 0
|
||||
while (search_box(x, y) or (x == player.x and y == player.y)) and count < 100 do
|
||||
x = math.random(0, SCREEN_WIDTH / TILE_SIZE - 1) * TILE_SIZE
|
||||
y = math.random(0, SCREEN_HEIGHT / TILE_SIZE - 1) * TILE_SIZE
|
||||
count = count + 1
|
||||
end
|
||||
if count == 100 then
|
||||
print("Não foi possível achar uma posição para a caixa")
|
||||
return
|
||||
end
|
||||
table.insert(boxes, {x = x, y = y})
|
||||
end
|
||||
|
||||
function love.keypressed(key)
|
||||
if key == "b" then
|
||||
generate_box()
|
||||
return
|
||||
end
|
||||
|
||||
if key == "i" then
|
||||
player.bombSize = player.bombSize + 1
|
||||
print("Novo tamanho de bomba: ", player.bombSize)
|
||||
return
|
||||
end
|
||||
|
||||
if key == "o" then
|
||||
player.bombSize = math.max(0, player.bombSize - 1)
|
||||
print("Novo tamanho de bomba: ", player.bombSize)
|
||||
return
|
||||
end
|
||||
|
||||
if key == "n" then
|
||||
player.maxBombs = player.maxBombs + 1
|
||||
print("Nova quantidade máxima de bombas: ", player.maxBombs)
|
||||
return
|
||||
end
|
||||
|
||||
if key == "m" then
|
||||
player.maxBombs = math.max(0, player.maxBombs - 1)
|
||||
print("Nova quantidade máxima de bombas: ", player.maxBombs)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
-- Set up initial map
|
||||
function love.load()
|
||||
love.window.setMode(SCREEN_WIDTH, SCREEN_HEIGHT)
|
||||
love.graphics.setBackgroundColor(0.1, 0.1, 0.1)
|
||||
|
||||
|
||||
math.randomseed(os.time())
|
||||
|
||||
-- Generate some destructible boxes randomly
|
||||
for i = 1, 10 do
|
||||
generate_box()
|
||||
end
|
||||
end
|
||||
|
||||
local function explode_bomb(i)
|
||||
local x = bombs[i].x
|
||||
local y = bombs[i].y
|
||||
|
||||
table.remove(bombs, i)
|
||||
player.bombCount = player.bombCount - 1
|
||||
|
||||
local adds = {
|
||||
{x = 1, y = 0},
|
||||
{x = 0, y = 1},
|
||||
{x = -1, y = 0},
|
||||
{x = 0, y = -1}
|
||||
}
|
||||
|
||||
table.insert(explosions, {x = x, y = y, time = 0})
|
||||
|
||||
for cur = 1, player.bombSize do
|
||||
for _, add in ipairs(adds) do
|
||||
local xd = x + cur * add.x * TILE_SIZE
|
||||
local yd = y + cur * add.y * TILE_SIZE
|
||||
|
||||
if xd >= 0 and xd <= SCREEN_WIDTH - TILE_SIZE and yd >= 0 and yd <= SCREEN_WIDTH - TILE_SIZE then
|
||||
table.insert(explosions, {x = xd, y = yd, time = 0})
|
||||
local box = search_box(xd, yd)
|
||||
if box then
|
||||
table.remove(boxes, box)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Player movement handling
|
||||
function love.update(dt)
|
||||
-- Player movement
|
||||
time = time + dt
|
||||
if time >= MOV_COOLDOWN then
|
||||
if love.keyboard.isDown("up") or love.keyboard.isDown("w") then
|
||||
if not search_box(player.x, player.y - player.speed) then
|
||||
player.y = player.y - player.speed
|
||||
end
|
||||
end
|
||||
|
||||
if love.keyboard.isDown("down") or love.keyboard.isDown("s") then
|
||||
if not search_box(player.x, player.y + player.speed) then
|
||||
player.y = player.y + player.speed
|
||||
end
|
||||
end
|
||||
|
||||
if love.keyboard.isDown("left") or love.keyboard.isDown("a") then
|
||||
if not search_box(player.x - player.speed, player.y) then
|
||||
player.x = player.x - player.speed
|
||||
end
|
||||
end
|
||||
|
||||
if love.keyboard.isDown("right") or love.keyboard.isDown("d") then
|
||||
if not search_box(player.x + player.speed, player.y) then
|
||||
player.x = player.x + player.speed
|
||||
end
|
||||
end
|
||||
|
||||
time = 0
|
||||
end
|
||||
|
||||
-- Ensure player stays inside the screen boundaries
|
||||
player.x = math.max(0, math.min(SCREEN_WIDTH - TILE_SIZE, player.x))
|
||||
player.y = math.max(0, math.min(SCREEN_HEIGHT - TILE_SIZE, player.y))
|
||||
|
||||
-- Bomb timer (when bomb is placed, it starts ticking down)
|
||||
for i, bomb in ipairs(bombs) do
|
||||
bomb.timer = bomb.timer - dt
|
||||
if bomb.timer <= 0 then
|
||||
explode_bomb(i)
|
||||
end
|
||||
end
|
||||
|
||||
for i, explosion in ipairs(explosions) do
|
||||
explosion.time = explosion.time + dt
|
||||
|
||||
if explosion.time >= EXPLOSION_TIMEOUT then
|
||||
table.remove(explosions, i)
|
||||
end
|
||||
end
|
||||
|
||||
-- Place bomb
|
||||
if love.keyboard.isDown("space") then
|
||||
-- Prevent placing multiple bombs at once
|
||||
if player.bombTimer <= 0 and player.bombCount < player.maxBombs and not search_bomb(player.x, player.y) then
|
||||
table.insert(bombs, {x = player.x, y = player.y, timer = 2, size = player.bombSize}) -- Bomb explodes after 2 seconds
|
||||
player.bombTimer = 0.15
|
||||
player.bombCount = player.bombCount + 1
|
||||
end
|
||||
end
|
||||
|
||||
-- Update bomb cooldown
|
||||
player.bombTimer = math.max(0, player.bombTimer - dt)
|
||||
end
|
||||
|
||||
-- Drawing the game world
|
||||
function love.draw()
|
||||
-- Draw destructible boxes
|
||||
love.graphics.setColor(1, 1, 0)
|
||||
for _, box in ipairs(boxes) do
|
||||
love.graphics.rectangle("fill", box.x, box.y, TILE_SIZE, TILE_SIZE)
|
||||
end
|
||||
|
||||
-- Draw player
|
||||
love.graphics.setColor(0, 0, 1)
|
||||
love.graphics.circle("fill", player.x + TILE_SIZE / 2, player.y + TILE_SIZE / 2, TILE_SIZE / 2)
|
||||
|
||||
-- Draw bombs
|
||||
love.graphics.setColor(1, 0, 0)
|
||||
for _, bomb in ipairs(bombs) do
|
||||
love.graphics.circle("fill", bomb.x + TILE_SIZE / 2, bomb.y + TILE_SIZE / 2, TILE_SIZE / 2)
|
||||
end
|
||||
|
||||
-- Draw explosions
|
||||
love.graphics.setColor(1, 0, 0)
|
||||
for _, explosion in ipairs(explosions) do
|
||||
love.graphics.rectangle("fill", explosion.x, explosion.y, TILE_SIZE, TILE_SIZE)
|
||||
end
|
||||
end
|
||||
Loading…
x
Reference in New Issue
Block a user