HIVE PICO-8 Tutorial
§7
7a: array tables, modulus & stretching sprites
eggcarton.p8
egg=1 eggcarton={1,2,3,4,"egg",{"whoa"}} print(eggcarton[6][1],0) --prints "woah" in white
flipbook.p8
hrozgo={1,2,0,3,4,0} sned={12,13,14,13} wulf={32,34,36,48,50,52} mydude_face=1 mydude_h=1 mydude_w=1 mydude_x=20 mydude_y=95 mydude_scale=1 function _draw() cls(3) sspr(mydude_face%16*8,mydude_face\16*8, mydude_w*8,mydude_h*8, mydude_x,mydude_y-mydude_scale*8*mydude_h, mydude_scale*8*mydude_w, mydude_scale*8*mydude_h ) end function _update() if btn(➡️) then mydude_x+=.5*mydude_scale end --shift-r for character if btn(⬅️) then mydude_x-=.5*mydude_scale end --shift-l for character if btn(⬆️) then mydude_scale+=.1 end --shift-u for character if btn(⬇️) then mydude_scale-=.1 end --shift-d for character mydude_scale=mid(.1,12,mydude_scale) end
7b: drawing scrolling sine waves with for & time
flipbook.p8
hrozgo={1,2,0,3,4,0} sned={12,13,14,13} wulf={32,34,36,48,50,52} mydude_face=1 mydude_h=1 mydude_w=1 mydude_x=20 mydude_y=95 mydude_scale=1 function _draw() cls(3) for wob=0,128 do local hill= sin(wob*.02+time()*.1)*5 line(wob,128,wob,mydude_y-10-40/mydude_scale+hill,2) end sspr(mydude_face%16*8,mydude_face\16*8, mydude_w*8,mydude_h*8, mydude_x,mydude_y-mydude_scale*8*mydude_h, mydude_scale*8*mydude_w, mydude_scale*8*mydude_h ) end function _update() if btn(➡️) then mydude_x+=.5*mydude_scale end --shift-r for character if btn(⬅️) then mydude_x-=.5*mydude_scale end --shift-l for character if btn(⬆️) then mydude_scale+=.1 end --shift-u for character if btn(⬇️) then mydude_scale-=.1 end --shift-d for character mydude_scale=mid(.1,12,mydude_scale) end
7c: flipbook animation with modulus & time
flipbook.p8
--tab 0 function wrong_flipbook(t) --not very flipbooky return rnd(t) end function still_wrong_flipbook(t) --only good for hrozgo, not sned nor wulf local index=tim print(index,10,10,8) return t[index] end framerate=4 function flipbook_good_enough(t) --good, but not as graceful; requires a counter local index=(tim/framerate)%#t+1 print(index,10,10,8) return t[index] end fr=10 function flipbook(a) local index=flr(t()*fr)%#a+1 --print(index,10,10,8) return a[index] end --tab 1 hrozgo={1,2,0,3,4,0} sned={12,13,14,13} wulf={32,34,36,48,50,52} mydude_face=1 mydude_h=1 mydude_w=1 mydude_x=20 mydude_y=95 mydude_scale=1 tim=0 function _draw() cls(3) mydude_face=flipbook(hrozgo) for wob=0,128 do local hill= sin(wob*.02+time()*.1)*5 line(wob,128,wob,mydude_y-10-40/mydude_scale+hill,2) end sspr(mydude_face%16*8,mydude_face\16*8, mydude_w*8,mydude_h*8, mydude_x,mydude_y-mydude_scale*8*mydude_h, mydude_scale*8*mydude_w, mydude_scale*8*mydude_h ) end function _update() --tim+=1 if btn(➡️) then mydude_x+=.5*mydude_scale end --shift-r for character if btn(⬅️) then mydude_x-=.5*mydude_scale end --shift-l for character if btn(⬆️) then mydude_scale+=.1 end --shift-u for character if btn(⬇️) then mydude_scale-=.1 end --shift-d for character mydude_scale=mid(.1,12,mydude_scale) end
7d: building tools & objectifying dudes with tables
flipbook.p8
--tab 0 fr=10 function flipbook(a) local index=flr(t()*fr)%#a+1 --print(index,10,10,8) return a[index] end --tab 1 hrozgo={1,2,0,3,4,0} sned={12,13,14,13} wulf={32,34,36,48,50,52} dudes={} function dude_dispenser(face,x,y) local a={ face=face, h=1, w=1, x=x, y=y, scale=1 } add(dudes, a) return a end yetanotherone=dude_dispenser(666,40,95) yetanotherone.w=2 mydude = dude_dispenser(1,20,95) anotherdude= dude_dispenser(12,18,97) --tim=0 function _draw() cls(3) mydude.face=flipbook(hrozgo) anotherdude.face=flipbook(sned) yetanotherone.face=flipbook(wulf) for wob=0,128 do local hill= sin(wob*.02+time()*.1)*5 line(wob,128,wob,mydude.y-10-40/mydude.scale+hill,2) end foreach(dudes,draw_dude) end function draw_dude(dude) sspr(dude.face%16*8,dude.face\16*8, dude.w*8,dude.h*8, dude.x,dude.y-dude.scale*8*dude.h, dude.scale*8*dude.w, dude.scale*8*dude.h ) end function _update() --tim+=1 if btn(➡️) then mydude.x+=.5*mydude.scale end --shift-r for character if btn(⬅️) then mydude.x-=.5*mydude.scale end --shift-l for character if btn(⬆️) then mydude.scale+=.1 end --shift-u for character if btn(⬇️) then mydude.scale-=.1 end --shift-d for character mydude.scale=mid(.1,12,mydude.scale) end
7e: adding complexity to your tools
flipbook.p8
--tab 0 fr=10 function flipbook(a) local index=flr(t()*fr)%#a+1 --print(index,10,10,8) return a[index] end --tab 1 hrozgo={1,2,0,3,4,0} sned={12,13,14,13} wulf={32,34,36,48,50,52} dudes={} function dude_dispenser(face,x,y) local a={ face=face, h=1, w=1, x=x, y=y, scale=1 } add(dudes, a) return a end --yetanotherone=dude_dispenser(666,40,95) --yetanotherone.w=2 mydude = dude_dispenser(1,20,95) --anotherdude= dude_dispenser(12,18,97) shadow=1 ground=2 sky=3 --tim=0 function _draw() cls(sky) mydude.face=flipbook(hrozgo) --anotherdude.face=flipbook(sned) --yetanotherone.face=flipbook(wulf) for wob=0,128 do local hill= sin(wob*.02+time()*.1)*5 line(wob,128,wob,mydude.y-10-40/mydude.scale+hill,ground) end foreach(dudes,draw_shad) foreach(dudes,draw_dude) end function draw_shad(dude) fillp(▒) --shift-b for character ovalfill(dude.x+.2*dude.scale,dude.y-dude.scale*8*0.08, dude.x+dude.scale*dude.w*8*.8,dude.y+dude.scale*8*0.08,shadow) fillp() end function draw_dude(dude) sspr(dude.face%16*8,dude.face\16*8, dude.w*8,dude.h*8, dude.x,dude.y-dude.scale*8*dude.h, dude.scale*8*dude.w, dude.scale*8*dude.h ) end function _update() --tim+=1 if btn(➡️) then mydude.x+=.5*mydude.scale end --shift-r for character if btn(⬅️) then mydude.x-=.5*mydude.scale end --shift-l for character if btn(⬆️) then mydude.scale+=.1 end --shift-u for character if btn(⬇️) then mydude.scale-=.1 end --shift-d for character mydude.scale=mid(.1,12,mydude.scale) end
7f: state machines
flipbook.p8
--tab 0; flipbooks fr=10 function flipbook(a) local index=(t()*fr)%#a+1 --print(index,10,10,8) return a[index] end --tab 1; dude facts hrozgo={1,2,0,3,4,0} sned={12,13,14,13} wulf={32,34,36,48,50,52} dudes={} function dude_dispenser(face,x,y) local a={ face=face, h=1, w=1, x=x, y=y, scale=1 } add(dudes, a) return a end function draw_shad(dude) fillp(▒) --shift-b for character ovalfill(dude.x+.2*dude.scale,dude.y-dude.scale*8*0.08, dude.x+dude.scale*dude.w*8*.8,dude.y+dude.scale*8*0.08,shadow) fillp() end function draw_dude(dude) sspr(dude.face%16*8,dude.face\16*8, dude.w*8,dude.h*8, dude.x,dude.y-dude.scale*8*dude.h, dude.scale*8*dude.w, dude.scale*8*dude.h ) end --tab 2 --yetanotherone=dude_dispenser(666,40,95) --yetanotherone.w=2 mydude = dude_dispenser(1,20,95) mydude.w =2 --anotherdude= dude_dispenser(12,18,97) shadow=1 ground=2 sky=3 printme=[[ once upon a time wulfgang was compelled to go adventuring... ]] --tim=0 state=2 states_u = { function() --1 if btn(➡️) then mydude.x+=.5*mydude.scale end --shift-r for character if btn(⬅️) then mydude.x-=.5*mydude.scale end --shift-l for character if btn(⬆️) then mydude.scale+=.1 end --shift-u for character if btn(⬇️) then mydude.scale-=.1 end --shift-d for character mydude.scale=mid(.1,12,mydude.scale) end,function() --2 if btn()>0 then state=1 end end,function() --3 end,function() --4 end,function() --5 end,function() --6 end } states_d = { function() --1 cls(sky) mydude.face=flipbook(wulf) --anotherdude.face=flipbook(sned) --yetanotherone.face=flipbook(wulf) for wob=0,128 do local hill= sin(wob*.02+time()*.1)*5 line(wob,128,wob,mydude.y-10-40/mydude.scale+hill,ground) end foreach(dudes,draw_shad) foreach(dudes,draw_dude) end,function() --2 cls(0) print(printme,4,50,10) end,function() --3 end,function() --4 end,function() --5 end,function() --6 end } function _draw() states_d[state]() end function _update() states_u[state]() end