Make a one-button game using pico8 #1
I have planned to continue making tutorial videos about making a game using pico8 and I think it will be easier if I write down content in the blog before using it to make the video with more detail. If you interesting you can follow my post to try to make this simple game.
It will be a one-button game. The player’s character will run back and forth inside the tower that consists of multiple levels. The player can press a button to jump to avoid obstacles and do a double jump to go to an upper level.
This first post will focus on making a prototype with the player’s character run back and forth inside the tower.
Create block that player can run inside
The tower is a stack of blocks and the player ‘s character can run inside 1 block at a time. A block needs to have variables to define position and size. So, we should create functions for “create a block data” and “draw a block from data”
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
Player run back and forth inside a block
The player’s character needs to have variables for the position, running direction and the current block.
player = {x=64,y=64,di=1} current_block = nil
After we declared variables, we need to create functions related to running inside a block. The first function for calculates the next player’s position and second function for checking that given position stay inside block area.
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 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
Put everything together
Now, we have prepared variables and functions that need for our first prototype. It’s time to put everything together inside _init(), _update60(), _draw() and we should have the player’s character run back and forth in the block.
function _init() current_block = create_block(16,64,96,8) end function _update60() player_running() end function _draw() cls(0) print("웃", player.x-3, player.y - 5, 7) draw_block(current_block, 7) end
Result
Source code
player = {x=64,y=64,di=1} 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 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 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 _init() current_block = create_block(16,64,96,8) end function _update60() player_running() end function _draw() cls(0) print("웃", player.x-3, player.y - 5, 7) draw_block(current_block, 7) end