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)
draw_block(b, 7)
end
end
ADD MORE BLOCKS
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()
add(block_list, create_block(16,64,96,8))
add(block_list, create_block(16,56,96,8))
add(block_list, create_block(16,48,96,8))
current_block = block_list[1]
end
RESULT

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()
add(block_list, create_block(16,64,96,8))
add(block_list, create_block(16,56,96,8))
add(block_list, create_block(16,48,96,8))
current_block = block_list[1]
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










