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
Merit Badge Challenge 7a ★★
PIXEL BUDDY ANIMATION WORKSHOP
Merit Badge Challenge 7a+ ★★
PIXEL BUDDY Draw a character animation cycle. Print your character enlarged on the screen. Implement sspr with a modulus such that you pass it a sprite index and it will calculate spritesheet x and y it needs, just like in the video.
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
Merit Badge Challenge 7b ★★★
SECONDARY ANIMATION WITH MATHS Attach timed sin/cos wave to a number variable and display it in a fun way alongside your earlier character.
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
Merit Badge Challenge 7c ★★★
THIEVERY & ART BREAK! Describe what each part of the last flipbook functrion does. Then steal the flipbook function! Just stone cold cut n paste it into your code! Make your pixel buddy move! Draw some friends for your pixel buddy.
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
Merit Badge Challenge 7d ★★★
STRUCTURED PIXEL BUDDY WORKSHOP propose your "object" table to the HIVELORDS (see 7d+)
Merit Badge Challenge 7d+ ★★★★
STRUCTURED PIXEL BUDDY Update your character code to work with "object" tables. Now you're cooking. Put all your pixel buddies in a scene together. Define a specific mood to the scene, such that some kind of relationship between characters or narrative is implied.
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
Merit Badge Challenge 7e ★★★★
PARTICLES WORKSHOP
Merit Badge Challenge 7e+ ★★★★★
PARTICLES In addition to drawing a shadow under each character, what other things could you do with the data you're keeping track of? Understanding the programming pattern of dispenser+object+set for the flipbooking dudes we're drawing on the screen, what other kinds of things can we simulate?
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
Merit Badge Challenge 7f ★★★★★
ARTIFICIAL INTELLIGENCE What if each of your dudes was a state machine? Simulate a bunch of creatures that do their thing but also react to player interaction. Good luck!
Merit Badge Challenge † ★★★★★★
INTERSECTIONS Combine concepts covered in previous 19 merit badges in a novel way. Loteria? Group project?
Merit Badge Challenge ∞ ★★★★★★
HORIZONS Go beyond: Hotspots. Tlines & fake 3D. Physics. Coroutines.