-
Notifications
You must be signed in to change notification settings - Fork 20
Life and Next Level Bonuses
In this part I want to implement two bonuses: one that adds a life and another that allows to finish a level skipping remaining blocks.
First it is necessary to add code to recognize "Life" and "Next Level" bonuses:
function bonuses.bonus_collected( i, bonus, balls, platform )
.....
elseif bonuses.is_life( bonus ) then
.....
elseif bonuses.is_next_level( bonus ) then
.....
end
.....
end
function bonuses.is_life( single_bonus )
local col = single_bonus.bonustype % 10
return ( col == 8 )
end
function bonuses.is_next_level( single_bonus )
local col = single_bonus.bonustype % 10
return ( col == 7 )
end
To reaction on "Add Life" bonus it is necessary to increase lives counter in the lives_display
table.
An appropriate function is implemented as lives_display.add_life()
.
I call it inside the bonuses.bonus_collected
, where currently all other reactions on bonuses are placed.
To do this, it is necessary to supply lives_display
as an argument to bonus_collected
, which requires
to pass it all the way down from the game.update
through collision-related functions (probably, not an optimal solution).
function game.update( dt )
.....
collisions.resolve_collisions( balls, platform,
walls, bricks,
bonuses, lives_display )
.....
end
function collisions.resolve_collisions( balls, platform,
walls, bricks,
bonuses, lives_display )
.....
collisions.platform_bonuses_collision( platform, bonuses,
balls, lives_display )
end
function collisions.platform_bonuses_collision( platform, bonuses,
balls, lives_display )
.....
if overlap then
bonuses.bonus_collected( i, bonus, balls, platform, lives_display )
end
.....
end
function bonuses.bonus_collected( i, bonus, balls, platform, lives_display )
.....
elseif bonuses.is_life( bonus ) then
lives_display.add_life()
elseif
.....
end
function lives_display.add_life()
lives_display.lives = lives_display.lives + 1
end
The "Next Level" bonus works the following way: when it is caught, a portal inside the right wall is activated. If the player touches the portal with the platform, transition to the next level occurs.
To indicate that a portal to the next level is open, a special flag in the right wall is activated
walls.current_level_walls["right"].next_level_bonus = true
if the bonus is caught.
This happens inside the bonuses.bonus_collected
function and again requires to pass the walls
table
as an argument through all the collision-related functions.
function collisions.resolve_collisions( balls, platform,
walls, bricks,
bonuses, lives_display )
.....
collisions.platform_bonuses_collision( platform, bonuses,
balls, walls,
lives_display )
end
function collisions.platform_bonuses_collision( platform, bonuses,
balls, walls,
lives_display )
.....
if overlap then
bonuses.bonus_collected( i, bonus,
balls, platform,
walls, lives_display )
end
.....
end
function bonuses.bonus_collected( i, bonus,
balls, platform,
walls, lives_display )
.....
elseif bonuses.is_next_level( bonus ) then
walls.current_level_walls["right"].next_level_bonus = true
end
.....
end
3.2) The display of the wall is changed.
function walls.draw_wall( single_wall )
.....
love.graphics.setColor( 255, 0, 0, 100 )
if single_wall.next_level_bonus then
love.graphics.setColor( 0, 0, 255, 100 )
end
love.graphics.rectangle( 'fill',
single_wall.position.x,
single_wall.position.y,
single_wall.width,
single_wall.height )
.....
end
3.3) If the platform touches the right wall, the game switches to the next level. It is more convenient to raise one more flag in the platform object and check it.
function collisions.platform_walls_collision( platform, walls )
.....
if overlap then
platform.bounce_from_wall( shift_platform, wall )
end
.....
end
function platform.bounce_from_wall( shift_platform, wall )
platform.position.x = platform.position.x + shift_platform.x
if wall.next_level_bonus then
platform.activated_next_level_bonus = true
end
end
function game.switch_to_next_level( bricks, levels )
if bricks.no_more_bricks or platform.activated_next_level_bonus then
.....
end
end
3.4) The effect of the bonus is lost if next level is reached or all the balls are lost
function game.enter( prev_state, ... )
.....
if args and args.current_level then
.....
platform.remove_bonuses_effects()
walls.remove_bonuses_effects()
end
end
function game.check_no_more_balls( balls, lives_display )
if balls.no_more_balls then
.....
platform.remove_bonuses_effects()
walls.remove_bonuses_effects()
.....
end
end
function platform.remove_bonuses_effects()
platform.remove_glued_effect()
platform.reset_size_to_norm()
platform.activated_next_level_bonus = false
end
function walls.remove_bonuses_effects()
walls.current_level_walls["right"].next_level_bonus = false
end
Feedback is crucial to improve the tutorial!
Let me know if you have any questions, critique, suggestions or just any other ideas.
Chapter 1: Prototype
- The Ball, The Brick, The Platform
- Game Objects as Lua Tables
- Bricks and Walls
- Detecting Collisions
- Resolving Collisions
- Levels
Appendix A: Storing Levels as Strings
Appendix B: Optimized Collision Detection (draft)
Chapter 2: General Code Structure
- Splitting Code into Several Files
- Loading Levels from Files
- Straightforward Gamestates
- Advanced Gamestates
- Basic Tiles
- Different Brick Types
- Basic Sound
- Game Over
Appendix C: Stricter Modules (draft)
Appendix D-1: Intro to Classes (draft)
Appendix D-2: Chapter 2 Using Classes.
Chapter 3 (deprecated): Details
- Improved Ball Rebounds
- Ball Launch From Platform (Two Objects Moving Together)
- Mouse Controls
- Spawning Bonuses
- Bonus Effects
- Glue Bonus
- Add New Ball Bonus
- Life and Next Level Bonuses
- Random Bonuses
- Menu Buttons
- Wall Tiles
- Side Panel
- Score
- Fonts
- More Sounds
- Final Screen
- Packaging
Appendix D: GUI Layouts
Appendix E: Love-release and Love.js
Beyond Programming: