Find unattached bubbles and make them fall
parent
00a355221b
commit
ad9a0ea35e
93
main.lua
93
main.lua
|
|
@ -132,6 +132,45 @@ local function find_matches(start_index)
|
||||||
return matches
|
return matches
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function find_unattached_bubbles()
|
||||||
|
local to_check = {}
|
||||||
|
local visited = {}
|
||||||
|
local attached = {}
|
||||||
|
local unattached = {}
|
||||||
|
|
||||||
|
-- start with top row bubbles attached to the ceiling
|
||||||
|
for i = 1, #game.levels[game.current_level][1] do
|
||||||
|
if game.bubble_slots[i].bubble_type ~= 0 then
|
||||||
|
to_check[#to_check+1] = i
|
||||||
|
attached[i] = true
|
||||||
|
end
|
||||||
|
visited[i] = true
|
||||||
|
end
|
||||||
|
|
||||||
|
while #to_check > 0 do
|
||||||
|
local current_index = table.remove(to_check)
|
||||||
|
local slot = game.bubble_slots[current_index]
|
||||||
|
|
||||||
|
for i = 1, #slot.neighbours do
|
||||||
|
local neighbour_index = slot.neighbours[i]
|
||||||
|
local neighbour = game.bubble_slots[neighbour_index]
|
||||||
|
if not visited[neighbour_index] and neighbour.bubble_type ~= 0 then
|
||||||
|
attached[neighbour_index] = true
|
||||||
|
to_check[#to_check+1] = neighbour_index
|
||||||
|
end
|
||||||
|
visited[neighbour_index] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for i = 1, #game.bubble_slots do
|
||||||
|
if game.bubble_slots[i].bubble_type ~= 0 and not attached[i] then
|
||||||
|
unattached[#unattached+1] = i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return unattached
|
||||||
|
end
|
||||||
|
|
||||||
function love.load(arg)
|
function love.load(arg)
|
||||||
if arg[#arg] == "debug" then require("lldebugger").start() end
|
if arg[#arg] == "debug" then require("lldebugger").start() end
|
||||||
|
|
||||||
|
|
@ -229,6 +268,7 @@ function love.load(arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
game.bursting_bubbles = {}
|
game.bursting_bubbles = {}
|
||||||
|
game.falling_bubbles = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
function love.update(dt)
|
function love.update(dt)
|
||||||
|
|
@ -298,6 +338,8 @@ function love.update(dt)
|
||||||
|
|
||||||
local matches = find_matches(nearest_slot_index)
|
local matches = find_matches(nearest_slot_index)
|
||||||
if #matches >= 3 then
|
if #matches >= 3 then
|
||||||
|
game.next_bubble = nil
|
||||||
|
|
||||||
-- remove matches
|
-- remove matches
|
||||||
for i = 1, #matches do
|
for i = 1, #matches do
|
||||||
local index = matches[i]
|
local index = matches[i]
|
||||||
|
|
@ -310,7 +352,20 @@ function love.update(dt)
|
||||||
}
|
}
|
||||||
game.bubble_slots[index].bubble_type = 0
|
game.bubble_slots[index].bubble_type = 0
|
||||||
end
|
end
|
||||||
game.next_bubble = nil
|
|
||||||
|
-- remove unattached bubbles
|
||||||
|
local unattached = find_unattached_bubbles()
|
||||||
|
for i = 1, #unattached do
|
||||||
|
local index = unattached[i]
|
||||||
|
game.falling_bubbles[#game.falling_bubbles+1] = {
|
||||||
|
x = game.bubble_slots[index].x,
|
||||||
|
y = game.bubble_slots[index].y,
|
||||||
|
velocity_x = i % 2 == 0 and -2 or 2,
|
||||||
|
velocity_y = love.math.random(-2.0, -5.0),
|
||||||
|
bubble_type = game.bubble_slots[index].bubble_type
|
||||||
|
}
|
||||||
|
game.bubble_slots[index].bubble_type = 0
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- calculate remaining bubble types
|
-- calculate remaining bubble types
|
||||||
|
|
@ -352,6 +407,23 @@ function love.update(dt)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if #game.falling_bubbles > 0 then
|
||||||
|
for i = #game.falling_bubbles, 1, -1 do
|
||||||
|
local bubble = game.falling_bubbles[i]
|
||||||
|
bubble.x = bubble.x + bubble.velocity_x
|
||||||
|
bubble.y = bubble.y + bubble.velocity_y
|
||||||
|
bubble.velocity_x = bubble.velocity_x * 0.99
|
||||||
|
bubble.velocity_y = bubble.velocity_y + 0.3 -- gravity 0.3
|
||||||
|
if bubble.x - game.bubble_radius <= game.level_left or
|
||||||
|
bubble.x + game.bubble_radius >= game.level_right then
|
||||||
|
bubble.velocity_x = -bubble.velocity_x
|
||||||
|
end
|
||||||
|
if bubble.y - game.bubble_radius > game.window_height then
|
||||||
|
table.remove(game.falling_bubbles, i)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if game.frame_by_frame then
|
if game.frame_by_frame then
|
||||||
game.paused = true
|
game.paused = true
|
||||||
game.frame_by_frame = false
|
game.frame_by_frame = false
|
||||||
|
|
@ -414,6 +486,7 @@ function love.draw(alpha)
|
||||||
game.launcher_offset_y
|
game.launcher_offset_y
|
||||||
)
|
)
|
||||||
|
|
||||||
|
-- draw bursting bubbles
|
||||||
if #game.bursting_bubbles > 0 then
|
if #game.bursting_bubbles > 0 then
|
||||||
for i = 1, #game.bursting_bubbles do
|
for i = 1, #game.bursting_bubbles do
|
||||||
local bubble = game.bursting_bubbles[i]
|
local bubble = game.bursting_bubbles[i]
|
||||||
|
|
@ -431,6 +504,24 @@ function love.draw(alpha)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- draw falling bubbles
|
||||||
|
if #game.falling_bubbles > 0 then
|
||||||
|
for i = 1, #game.falling_bubbles do
|
||||||
|
local bubble = game.falling_bubbles[i]
|
||||||
|
love.graphics.setColor(1, 1, 1, bubble.alpha)
|
||||||
|
love.graphics.draw(
|
||||||
|
game.bubble_images[bubble.bubble_type],
|
||||||
|
bubble.x + bubble.velocity_x * alpha,
|
||||||
|
bubble.y + bubble.velocity_y * alpha,
|
||||||
|
0,
|
||||||
|
bubble.scale,
|
||||||
|
bubble.scale,
|
||||||
|
game.bubble_radius,
|
||||||
|
game.bubble_radius
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- draw next bubble
|
-- draw next bubble
|
||||||
-- if moving, extrapolate position based on alpha value from love.run
|
-- if moving, extrapolate position based on alpha value from love.run
|
||||||
if game.next_bubble then
|
if game.next_bubble then
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue