MAKE A ONE-BUTTON GAME USING PICO8 #2 - JUMPING
From the previous post, we have the player’s character move in horizontal. The next step will be moving in vertical. It will include the player’s character jumping, gravity, and fall after jumping off the block.
ADD MORE VARIABLES
For check jumping and falling. It requires 2 more variables.
– “jump_counter”, It uses to count how long the player’s character will keep going up. Equal or less than 0 means the player’s character will falling follow gravity.
– “ground“, It uses to tell the current status that the player’s character standing on the ground.
We will add these 2 variables into the player variable.
player = {x=64,y=64,di=1,jump_counter=0,ground=true}
ADD FUNCTION FOR JUMPING
We add a new function called “player_jumping()“. This function will handle when the player presses the “jump” button. If the player character’s stay on the ground. It will set the value to variables to make 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
After the part for check the pressing button and assigned the value to variables. The function will use those variables to decide that the player’s character should be going up or not.
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
ADD FUNCTION FOR APPLY GRAVITY
We will create a new function called “player_apply_gravity()”. It will use for makes the player’s character falling when It does not stand on the ground.
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
PUT EVERYTHING TOGETHER
After created 2 new functions. we need to put them in the "_update60()" function to make them working.
function _update60()
player_running()
player_jumping()
player_apply_gravity()
end
RESULT
Press “z” button will make the player’s character jump and It can jump over the block’s wall and falling outside the block.

SOURCE CODE
player = {x=64,y=64,di=1,jump_counter=0,ground=true}
current_block = nil
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 _init()
current_block = create_block(16,64,96,8)
end
function _update60()
player_running()
player_jumping()
player_apply_gravity()
end
function _draw()
cls(0)
print("웃", player.x-3, player.y - 5, 7)
draw_block(current_block, 7)
end










