-
Notifications
You must be signed in to change notification settings - Fork 17
Simple Level
In Arkanoid the bricks are arranged in a 2d-pattern. The simplest way to create such a pattern is to define several rows and columns with bricks.
bricks.rows = 8
bricks.columns = 11
Actual bricks construction happens during level creation.
For each brick we have to provide at least it's top left corner position.
To calculate it, we need to know a number of rows and number of columns,
position of the top left corner of the top left brick, width and height of individual bricks, and, finally, horizontal and vertical distances between them. With such information, it is possible to populate
bricks.current_level_bricks
:
local bricks = {}
bricks.rows = 8 --(*1a)
bricks.columns = 11
bricks.top_left_position_x = 70
bricks.top_left_position_y = 50
bricks.brick_width = 50
bricks.brick_height = 30
bricks.horizontal_distance = 10
bricks.vertical_distance = 15 --(*1b)
bricks.current_level_bricks = {}
.....
function bricks.construct_level()
for row = 1, bricks.rows do
for col = 1, bricks.columns do
local new_brick_position_x = bricks.top_left_position_x + --(*2)
( col - 1 ) *
( bricks.brick_width + bricks.horizontal_distance )
local new_brick_position_y = bricks.top_left_position_y + --(*2)
( row - 1 ) *
( bricks.brick_height + bricks.vertical_distance )
local new_brick = bricks.new_brick( new_brick_position_x, --(*3)
new_brick_position_y )
table.insert( bricks.current_level_bricks, new_brick ) --(*4)
end
end
end
(*1a)-(*1b): definition of the properties necessary to compute top left corner position for each brick.
(*2): top left position is computed.
(*3): a new brick is created.
(*4): the new brick is inserted into the bricks table.
It is possible to update and draw each brick by iterating over bricks.current_level_bricks
and
calling the corresponding function for each single brick:
function bricks.draw()
for _, brick in pairs( bricks.current_level_bricks ) do --(*1)
bricks.draw_brick( brick )
end
end
function bricks.update( dt )
for _, brick in pairs( bricks.current_level_bricks ) do
bricks.update_brick( brick )
end
end
(*1): an underscore _
is a valid Lua name, that is commonly used for dumb variables,
that are not necessary in the further code.
In this part, I also want to add the walls on the borders of the screen.
A wall is a rectangle, just as a brick is, so I use a walls
table which is quite
similar to bricks
in it's structure.
There is a minor difference in walls.new_wall
constructor: I do not provide a
default width and height for the wall:
function walls.new_wall( position_x, position_y, width, height )
return( { position_x = position_x,
position_y = position_y,
width = width,
height = height } )
end
In walls.construct_walls
, the left, right, top and bottom walls are constructed and than placed into the
walls.current_level_walls
table.
function walls.construct_walls()
local left_wall = walls.new_wall(
0,
0,
walls.wall_thickness,
love.graphics.getHeight()
)
local right_wall = walls.new_wall(
love.graphics.getWidth() - walls.wall_thickness,
0,
walls.wall_thickness,
love.graphics.getHeight()
)
local top_wall = walls.new_wall(
0,
0,
love.graphics.getWidth(),
walls.wall_thickness
)
local bottom_wall = walls.new_wall(
0,
love.graphics.getHeight() - walls.wall_thickness,
love.graphics.getWidth(),
walls.wall_thickness
)
walls.current_level_walls["left"] = left_wall
walls.current_level_walls["right"] = right_wall
walls.current_level_walls["top"] = top_wall
walls.current_level_walls["bottom"] = bottom_wall
end
Constructors for the walls and the bricks have to be placed in love.load
, so
the walls and the bricks are created on the start of the game:
function love.load()
bricks.construct_level()
walls.construct_walls()
end
Finally, the love.update
and love.draw
functions now look like:
function love.update( dt )
ball.update( dt )
platform.update( dt )
bricks.update( dt )
walls.update( dt )
end
function love.draw()
ball.draw()
platform.draw()
bricks.draw()
walls.draw()
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: