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

Related Posts