Screen Shake in PICO-8


Here is a simple screen shake function which can easily be added to your PICO-8 projects.

The principle uses the camera which is well explained here.  In essence, the camera moves a window around the draw area resulting in everything on screen being shifted by a certain amount (importantly, although not for this, the camera offset is subtracted to any draw coordinates).

Initially we set a variable (offset) which represent the multiple of camera offset (bigger is more shake).  This variable should be declared at the very beginning of your program (either in _init or before).  What is important is offset is global in scope.


Next we need the function that will do the shaking.  I call this function screen_shake() and it works by slowly decreasing the offset value towards 0.  Every time this function is called (once per draw cycle) two random offsets are generated (offset_x, offset_y) and these values is multiplied by offset (which is decreasing, remember) and applied to the camera.

function screen_shake()
  local fade = 0.95
  local offset_x=16-rnd(32)
  local offset_y=16-rnd(32)


  if offset<0.05 then

In order for the shake to work, the screen_shake() function is placed at the start of any _draw() calls your program may have.

function _draw()

  -- stuff is drawn here, but by a slowly decreasing offset

To create a screen shake all that is needed is to set the offset variable in the _update() function.


Play around with the various variables to get just the shake you are looking for.

Happy programming!

You May Also Like

About the Author: Doc Robs