## MAKE A ONE-BUTTON GAME USING PICO8 #3 – JUMPING(2)

We continue working from the previous post by adding new logic to jump between blocks. It will be a simple logic.  When the player’s character jumps outside the current block. It will start looking for another block to set as the current block.

###### PREPARE VARIABLES TO SUPPORT MULTIPLE BLOCKS
```We add a new variable to keep all created blocks.

block_list = {}```
###### ADD A NEW FUNCTION TO LOOKING FOR THE NEW CURRENT BLOCK
```This function will start looking for the new current block when the player's character doesn't stand on the ground and stay outside the current block.

function player_find_new_current_block()
if player.ground == false and
is_inside_block(player.x, player.y, current_block) == false then

for b in all(block_list) do
if is_inside_block(player.x, player.y, b) == true then
current_block = b
break
end
end
end
end```
```And add this function in update()

function _update60()
player_running()
player_jumping()
player_apply_gravity()
player_find_new_current_block()
end

```
###### ADD CODE TO DRAW ALL BLOCKS

We will modify the current draw() to support drawing all the blocks in the “block_list” variable.

function _draw()
cls(0)
print(“웃”, player.x-3, player.y – 5, 7)

for b in all(block_list) do
draw_block(b, 7)
end
end
`Now we have prepared variables and functions enough for making the player's character jump between the blocks. The only thing we need to do is creating new block data.`
```function _init()
current_block = block_list
end

```
###### SOURCE CODE
```player = {x=64,y=64,di=1,jump_counter=0,ground=true}
current_block = nil

block_list = {}

function create_block(x,y,w,h)
return {x=x,y=y,w=w,h=h}
end

function draw_block(b,c)
if (b == nil) return
rect(b.x,b.y,b.x+b.w,b.y-b.h,c)
end

function is_inside_block(x,y,b)
if (b == nil) return
if x >= b.x and x < b.x + b.w then
if y <= b.y and y > b.y - b.h then
return true
end
end

return false
end

function player_running()
local next_px = player.x + player.di
if is_inside_block(player.x, player.y, current_block) == true and
is_inside_block(next_px, player.y, current_block) == false then
player.di = player.di * -1
next_px = player.x + player.di
end

player.x = next_px
end

function player_jumping()
if btnp(4) then
if player.jump_counter == 0 and player.ground == true then
player.jump_counter = 20
player.ground = false
end
end
local next_py = player.y

if player.jump_counter > 0 then
player.jump_counter -= 1

if player.jump_counter > 10 then
next_py = player.y - 1
else
next_py = player.y
end
end

player.y = next_py
end

function player_apply_gravity()
local next_py = player.y
if player.ground == false then
if player.jump_counter <= 0 then
next_py += 1

if  is_inside_block(player.x, player.y, current_block) == true and
is_inside_block(player.x, next_py, current_block) == false then

next_py = player.y
player.ground = true
end
end
end
player.y = next_py
end

function player_find_new_current_block()

if player.ground == false and
is_inside_block(player.x, player.y, current_block) == false then

for b in all(block_list) do
if is_inside_block(player.x, player.y, b) == true then
current_block = b
break
end
end
end
end

function _init()
current_block = block_list
end

function _update60()
player_running()
player_jumping()
player_apply_gravity()
player_find_new_current_block()
end

function _draw()
cls(0)
print("웃", player.x-3, player.y - 5, 7)

for b in all(block_list) do
draw_block(b, 7)
end
end
```