

CONTENT WARNING
FLASHING LIGHTS
MAMA CABRA is a goat space shooter. Shoot space foes, save sheepies and smell the flowers. Play it with your mouse.
Made for the I, Rebel game jam 2025. Powered by Atari.



It's been 10 years since PICO-8's release...
Let's celebrate! here's a small cart with some PICO-8 history and trivia.
I've been so glad to have found PICO-8 a year ago, and couldn't wait to add to the PICO-8 lore in my own way. That said, I am very happy to have been able to research and share this history with you! Feel free to share what you love about PICO-8 below, etc. Thanks for making the PICO-8 community great!
(The music is Space Lizards by @Gruber.)





Hi, I'm very new to Pico-8 and coding in general. I've been following some tutorials on how to work in Pico-8, which go over basic elements using separate projects. In order to further my understanding of how the pieces fit together, I wanted to try to incorporate each tutorial into one project. I'm having some trouble though, because my code throws an error when I try to refer to my player class.
This is the code I have in Tab 0, the original code to set up movement and directional sprites for the player:
function _init() player={ x=63, y=63, fx=false, fy=false, sp=1, speed=1 } end function _update() --player movement-- if btn(➡️) then player.x+=player.speed player.sp=9 player.fx=false player.fy=false end if btn(⬅️) then player.x-=player.speed player.sp=9 player.fx=true player.fy=false end if btn(⬇️) then player.y+=player.speed player.sp=1 end if btn(⬆️) then player.y-=player.speed player.sp=5 end if mget(flr((player.x+4)/8),flr((player.y+4)/8))==33 then player.speed=1.2 else player.speed=1 end end function _draw() cls(3) map() spr(player.sp,player.x, player.y,1,1,player.fx, player.fy) print(mget(flr((player.x+4)/8),flr((player.y+4)/8))) end |
That all works fine, but when I add code from the animation tutorial into Tab 1, it throws
RUNTIME ERROR LINE 15 TAB 1
IF PLAYER.SP<LAST_FRAME THEN
ATTEMPT TO INDEX GLOBAL 'PLAYER'
(A NIL VALUE)
function _init() stimer=0 ani_speed=10 first_frame=1 last_frame=4 end function _update() --player animation-- if stimer < ani_speed then stimer+=1 else if player.sp < last_frame then player.sp+=1 else player.sp=first_frame end stimer=0 end end function _draw() end |
(There aren't spaces before and after my '<' signs in the code, I added those so it would display correctly here.)
For some reason, it doesn't recognize the class I defined. I tried putting the code into Tab 0 instead, to the same effect. What am I doing wrong here? I was under the impression that defining variables under a class allows you to change those variables by referencing as CLASS.VAR. Any advice would be appreciated.



How to Play
Combo Galaxy is an arcade shoot-em-up game inspired by Space Invaders and Cherry Bomb. Destroy round after round of aliens in your path with your ship the Crimson Swift and try to get the highest score you can!
Controls
Keyboard
• Arrow Keys – Move your ship
• Z / N / C – Blast Lasers
• X / M / V – Deploy Star Bombs
Controller
• L Stick / D-pad – Move your ship
• A / Y – Blast Lasers
• X / B – Deploy Star Bombs
Star Bombs
Star Bombs are a collectible that defeated enemies will sometimes drop. Collecting it will increase your star bomb ammo count by 1 and the more ammo you have the more bombs you will deploy all at once! Collecting 4 Star Bombs will restore 1HP but also reset your star bomb ammo count to 0. If you have full HP, collecting 4 Star Bombs will instead reset your star bomb ammo count to 0 and give you 2500 points, so consider saving your ammo to get a higher score if you feel you can beat the game without them.


SSPR sandbox
According to the documentation, sspr is pretty self explanatory :
QUOTE
SSPR(SX, SY, SW, SH, DX, DY, [DW, DH], [FLIP_X], [FLIP_Y]]
Stretch a rectangle of the sprite sheet (sx, sy, sw, sh) to a destination rectangle on the screen (dx, dy, dw, dh). In both cases, the x and y values are coordinates (in pixels) of the rectangle's top left corner, with a width of w, h.
Colour 0 drawn as transparent by default (see PALT())
dw, dh defaults to sw, sh
When FLIP_X is TRUE, flip horizontally.
When FLIP_Y is TRUE, flip vertically.
END OF QUOTE
So I was pretty surprised to see an upside down sprite while debugging, when I knew I wasn't even using the flip parameters anywhere.
Things are pretty normal as long as the coordinates are in the 0-127 range and the sizes in the 1-128.
What happens otherwise is unclear, so I wrote this little test cart. (image in the sprite sheet by Freds72)


8SH – A tiny precision platformer adventure
Hello everyone,
I'm happy to share my latest project: 8SH, a small adventure platformer made in Pico-8.
It features smooth movement and tight, responsive controls, with short levels that focus on timing, flow, and precision.
Inspired by The End is Nigh by Edmund McMillen and Tyler Glaiel, I aimed to capture that same snappy feel in a more compact format.
This is a personal Pico-8 release, and I’d love to hear what you think — feedback is always welcome!
.gif[/img]


.png)



Cart number 2!!
Continuing to learn how to manipulate tables...
This is an extension of the basics with self contained entities that are modular and behavior override friendly. It includes basic platform and entity collision logic with soft camera tracking. Frame set animation with integrated low resolution mode (64x64) as well. I hope it helps other beginners out there learn the amazing quirks of pico-8!
Entity oriented programming adapted from a study of https://www.lexaloffle.com/bbs/?pid=116846 by Johan Pietz.
-JS