MAKE A ONE-BUTTON GAME USING PICO8 #7 – BLOCK WITH NO FLOOR
For making block support no floor. The steps that we need todo likely the same as the previous post.
– Add a variable to block data structure.
– Add condition for checking ground.
– Add condition for drawing block’s floor.
ADD A VARIABLE FOR BLOCK'S FLOOR
We need to modify a function for creating block data by adding “ground”.
function create_block(x,y,w,h,left_wall,right_wall, floor) return {x=x,y=y,w=w,h=h,obstacles={},left_wall=left_wall,right_wall=right_wall,floor=floor} end
CONDITION FOR CHECKING GROUND
This condition need to add to “player_apply_gravity()” function. Before we set value that the player’s character stands on the ground. It needs to check that the block has the floor to stand.
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 and
current_block.floor == true
then
next_py = player.y
player.ground = true
end
end
else
if is_inside_block(player.x, player.y, current_block) == false then
player.ground = false
end
end
player.y = next_py
end
MODIFY DRAWING BLOCK FUNCTION
For “draw_block()” function. we will add a condition for checking the “floor” variable for draw block’s floor and we need to remove code for draw block’s ceiling.
function draw_block(b,c)
if (b == nil) return if b.floor == true then line(b.x,b.y,b.x+b.w,b.y,c) end if b.left_wall == true then line(b.x,b.y,b.x,b.y-b.h,c) end if b.right_wall == true then line(b.x+b.w,b.y,b.x+b.w,b.y-b.h,c) end for obs in all(b.obstacles) do print("✽", b.x + (b.w*obs.value), b.y - 6, 8) end end
EDIT BLOCKS
We will edit codes in the “_init()” function that creates block’s data to show what we can achieve with the block with no floor.
function _init() add(block_list, create_block(16,64,96,8,true ,true , true)) add(block_list, create_block(16,56,96,8,true ,false, true)) add(block_list, create_block(16,48,96,8,false,false , true)) add(block_list, create_block(16,40,96,8,true,true , false)) player_reset() end
RESULT

player = {x=64,y=64,di=1,jump_counter=0,ground=true}
current_block = nil
block_list = {}
function create_block(x,y,w,h,left_wall,right_wall, floor)
return {x=x,y=y,w=w,h=h,obstacles={},left_wall=left_wall,right_wall=right_wall,floor=floor}
end
function draw_block(b,c)
if (b == nil) return
if b.floor == true then
line(b.x,b.y,b.x+b.w,b.y,c)
end
if b.left_wall == true then
line(b.x,b.y,b.x,b.y-b.h,c)
end
if b.right_wall == true then
line(b.x+b.w,b.y,b.x+b.w,b.y-b.h,c)
end
for obs in all(b.obstacles) do
print("✽", b.x + (b.w*obs.value), b.y - 6, 8)
end
end
function distance(x1,y1,x2,y2)
local dx = x1-x2
local dy = y1-y2
local distance = sqrt(dx*dx+dy*dy)
return distance
end
function change_current_block(b)
current_block = b
local d = distance(camera_data.target_x + 64, camera_data.target_y + 64, current_block.x + current_block.w/2, current_block.y - current_block.h/2)
_debug = d
if d > 12 then
set_camera_target(current_block)
end
end
function add_obstacle(b,v)
if (b == nil) return
add(b.obstacles, {value=v})
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
if player.di == 1 and current_block.right_wall == false then
elseif player.di == -1 and current_block.left_wall == false then
else
player.di = player.di * -1
next_px = player.x + player.di
end
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 and
current_block.floor == true
then
next_py = player.y
player.ground = true
end
end
else
if is_inside_block(player.x, player.y, current_block) == false then
player.ground = false
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
change_current_block(b)
break
end
end
end
end
function player_hit_obstacle(b)
if b == nil then return false end
if is_inside_block(player.x, player.y, current_block) == false then return false end
for o in all(b.obstacles) do
local d = distance(player.x, player.y, (b.x + b.w * o.value), b.y)
if d < 3 then
return true
end
end
end
function player_reset()
player = {x=64,y=64,di=1,jump_counter=0,ground=true}
change_current_block(block_list[1])
end
camera_data = {x=0,y=0,target_x=0,target_y=0}
function set_camera_target(b)
if b == nil then return end
local block_center_x = b.x + b.w/2
local block_center_y = b.y - b.h/2
camera_data.target_x = block_center_x - 64
camera_data.target_y = block_center_y - 64
end
function update_camera()
if camera_data.x > camera_data.target_x then
camera_data.x -= 1
elseif camera_data.x < camera_data.target_x then
camera_data.x += 1
end
if camera_data.y > camera_data.target_y then
camera_data.y -= 1
elseif camera_data.y < camera_data.target_y then
camera_data.y += 1
end
camera(camera_data.x, camera_data.y)
end
function _init()
add(block_list, create_block(16,64,96,8,true ,true , true))
add(block_list, create_block(16,56,96,8,true ,false, true))
add(block_list, create_block(16,48,96,8,false,false , true))
add(block_list, create_block(16,40,96,8,true,true , false))
player_reset()
end
function _update60()
player_running()
player_jumping()
player_apply_gravity()
player_find_new_current_block()
local hit_result = player_hit_obstacle(current_block)
if hit_result == true then
player_reset()
end
update_camera()
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










