Remove and animate matched bubbles
parent
0d4c32864c
commit
00a355221b
100
main.lua
100
main.lua
|
|
@ -227,6 +227,8 @@ function love.load(arg)
|
|||
velocity_x = 0,
|
||||
velocity_y = 0
|
||||
}
|
||||
|
||||
game.bursting_bubbles = {}
|
||||
end
|
||||
|
||||
function love.update(dt)
|
||||
|
|
@ -234,7 +236,9 @@ function love.update(dt)
|
|||
return
|
||||
end
|
||||
|
||||
if game.next_bubble.velocity_x ~= 0 or game.next_bubble.velocity_y ~= 0 then
|
||||
if game.next_bubble and
|
||||
(game.next_bubble.velocity_x ~= 0 or game.next_bubble.velocity_y ~= 0) then
|
||||
|
||||
local next_x = game.next_bubble.x + game.next_bubble.velocity_x
|
||||
local next_y = game.next_bubble.y + game.next_bubble.velocity_y
|
||||
local bubble_should_stop = false
|
||||
|
|
@ -286,19 +290,68 @@ function love.update(dt)
|
|||
|
||||
if bubble_should_stop then
|
||||
local nearest_slot_index = find_nearest_slot(next_x, next_y)
|
||||
game.bubble_slots[nearest_slot_index].bubble_type = game.next_bubble.bubble_type
|
||||
game.next_bubble.x = game.bubble_slots[nearest_slot_index].x
|
||||
game.next_bubble.y = game.bubble_slots[nearest_slot_index].y
|
||||
game.next_bubble.velocity_x = 0
|
||||
game.next_bubble.velocity_y = 0
|
||||
game.bubble_slots[nearest_slot_index].bubble_type = game.next_bubble.bubble_type
|
||||
|
||||
local matches = find_matches(nearest_slot_index)
|
||||
if #matches >= 3 then
|
||||
-- remove matches
|
||||
for i = 1, #matches do
|
||||
local index = matches[i]
|
||||
game.bursting_bubbles[#game.bursting_bubbles+1] = {
|
||||
x = game.bubble_slots[index].x,
|
||||
y = game.bubble_slots[index].y,
|
||||
bubble_type = game.bubble_slots[index].bubble_type,
|
||||
scale = 1.0,
|
||||
alpha = 1.0
|
||||
}
|
||||
game.bubble_slots[index].bubble_type = 0
|
||||
end
|
||||
game.next_bubble = nil
|
||||
end
|
||||
|
||||
-- calculate remaining bubble types
|
||||
local total_bubble_count, counts_by_type = get_bubble_counts()
|
||||
if total_bubble_count == 0 then
|
||||
print('level cleared!')
|
||||
else
|
||||
local bubble_types = {}
|
||||
for bubble_type, count in pairs(counts_by_type) do
|
||||
if bubble_type >= 1 and bubble_type <= 8 then
|
||||
bubble_types[#bubble_types+1] = bubble_type
|
||||
end
|
||||
end
|
||||
-- get next bubble
|
||||
game.next_bubble_index = game.next_bubble_index + 1
|
||||
game.next_bubble = {
|
||||
x = game.launcher_x,
|
||||
y = game.launcher_y,
|
||||
bubble_type = get_next_bubble_type(game.next_bubble_index, bubble_types),
|
||||
velocity_x = 0,
|
||||
velocity_y = 0
|
||||
}
|
||||
end
|
||||
|
||||
else
|
||||
game.next_bubble.x = next_x
|
||||
game.next_bubble.y = next_y
|
||||
end
|
||||
end
|
||||
|
||||
if #game.bursting_bubbles > 0 then
|
||||
for i = #game.bursting_bubbles, 1, -1 do
|
||||
local bubble = game.bursting_bubbles[i]
|
||||
bubble.scale = bubble.scale * 1.05
|
||||
bubble.alpha = bubble.alpha - 0.1
|
||||
if bubble.scale >= 1.5 then
|
||||
table.remove(game.bursting_bubbles, i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if game.frame_by_frame then
|
||||
game.paused = true
|
||||
game.frame_by_frame = false
|
||||
|
|
@ -361,23 +414,42 @@ function love.draw(alpha)
|
|||
game.launcher_offset_y
|
||||
)
|
||||
|
||||
if #game.bursting_bubbles > 0 then
|
||||
for i = 1, #game.bursting_bubbles do
|
||||
local bubble = game.bursting_bubbles[i]
|
||||
love.graphics.setColor(1, 1, 1, bubble.alpha)
|
||||
love.graphics.draw(
|
||||
game.bubble_images[bubble.bubble_type],
|
||||
bubble.x,
|
||||
bubble.y,
|
||||
0,
|
||||
bubble.scale,
|
||||
bubble.scale,
|
||||
game.bubble_radius,
|
||||
game.bubble_radius
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
-- draw next bubble
|
||||
-- if moving, extrapolate position based on alpha value from love.run
|
||||
love.graphics.setColor(1, 1, 1, 1)
|
||||
love.graphics.draw(
|
||||
game.bubble_images[game.next_bubble.bubble_type],
|
||||
game.next_bubble.x + game.next_bubble.velocity_x * alpha,
|
||||
game.next_bubble.y + game.next_bubble.velocity_y * alpha,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
game.bubble_radius,
|
||||
game.bubble_radius
|
||||
)
|
||||
if game.next_bubble then
|
||||
love.graphics.setColor(1, 1, 1, 1)
|
||||
love.graphics.draw(
|
||||
game.bubble_images[game.next_bubble.bubble_type],
|
||||
game.next_bubble.x + game.next_bubble.velocity_x * alpha,
|
||||
game.next_bubble.y + game.next_bubble.velocity_y * alpha,
|
||||
0,
|
||||
1,
|
||||
1,
|
||||
game.bubble_radius,
|
||||
game.bubble_radius
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
function love.mousepressed(x, y, button, is_touch, presses)
|
||||
if button == 1 then
|
||||
if button == 1 and game.next_bubble then
|
||||
local diff_x = x - game.launcher_x
|
||||
local diff_y = y - game.launcher_y
|
||||
local dist = math.sqrt(diff_x * diff_x + diff_y * diff_y)
|
||||
|
|
|
|||
Loading…
Reference in New Issue