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.
offset=0
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) offset_x*=offset offset_y*=offset camera(offset_x,offset_y) offset*=fade if offset<0.05 then offset=0 end end
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() screen_shake() -- -- stuff is drawn here, but by a slowly decreasing offset -- end
To create a screen shake all that is needed is to set the offset variable in the _update() function.
offset=1.5
Play around with the various variables to get just the shake you are looking for.
Happy programming!