This is a tutorial to explain how to implement Zelda-Style map scrolling. Once again we try to re-create the behavior of Zelda Link's Awakening DX as closely as possible. In the process we discuss the space limitations of Pico-8 and how to circumvent them. The code in the following carts is explained in this video:
Note, due to difficulties with reload on the BSS the indoor areas are currently not working in the browser. Download the files locally. You might need to rename the indoor file to indoor.p8 for it to work:

Starfall
Description:
A fast-paced top-down space shooter built in PICO-8!
Fight your way through endless waves of enemies, earn coins, and spend them in the shop between levels to upgrade your ship. How far can you get?
Features:
3 difficulty modes (Easy / Normal / Hard)
Upgrade system: spread shot, rapid fire, pierce shot, speed boost, extra lives
Enemies get faster and smarter as you level up
Animated thrusters, hit flashing, and particle explosions
Chiptune soundtrack
Controls:
Arrow keys – move
C – shoot
X – pause / confirm

Not sure what the best place to post this is. But I have been working on running PICO-8 on the gameboy (and gameboy color). This is a completely unmodified gameboy. But it is a custom cartridge that contains a co-processor that actually runs pico8 emulation. (The white cable is an USB cable for debugging, it runs without this attached)
It maps each of the 16 PICO-8 colors to one of the 4 gameboy colors. And Celeste is already fully playable (without sound)
While the Gameboy Color supports more colors, it still only maps to 4 colors there, due to how rendering on the Gameboy works you cannot have more then 4 colors per 8x8 tile.

I created a tie-in game for my album release!
Boom Bap Billy has GAS (Gear Acquisition Syndrome). Help him track down the only known cure, new gear. Watch out for the Hyperfighters who believe GAS should be treated… permanently.
Along the way, collect the Beat Tapes hidden across the city by beatrush, who stashed them to avoid releasing his music.
Summary
Immerse yourself in a mesmerizing cosmic simulation where thousands of particles dance like spinning galaxies and stars.
(I've also made a Picotron version)
Controls
- Use the arrow keys to move around.
- Use Z and X to zoom in and out.
Hold both Z and X together then...
- Use Left and Right to adjust the speed of the animation.
- Press Down to pause and resume the animation
- Press Up to reset everything
Based on an algorithm by yuruyurau

Space Junk!
My dear sons,
This was intended to be a more simple game than the last. Using what I’ve learned from the Lazy Devs Tutorial on the first game, and a bit more through this other videos. You’re a lowly satellite trying to dodge space junk flying around and crashing into Earth. The longer you survive, and the closer you are to Earth- the higher your score! Will you survive the planet’s last moments?
Skidibidi-rinkidink, skidibidi-rinkido, I love you,
Dad
Game & Controls
Use the arrow keys or intuitive movement controls to move the satellite around the earth. The action buttons pause the game. You win the game once the timer hits 10 minutes. Every 2 minutes you will get an incoming message of a barrage. The junk will fly in more frequently and faster. At the end of the barrage you’ll return to full signal strength. You’ll occasionally encounter a little sunshine pick up. That will also help you increase your signal strength (life) by one bar. The junk, earth, explosions, and impact shock waves will all decrease your signal strength should you happen to be curious. Lastly, per my new tradition, yes there is a secret level to greatly improve your score. My only hint is that there is an angle, time, and distance for everything...
Credits & Learnings
Once again I owe this idea and leanings to the Lazy Devs Academy. I think it was from a video discussing sin waves in one of his later videos in the SHUMP coding tutorial. He’s a great teacher and makes some really fun games. I’m sure I’ve shown you them already. If not, let me know and I’ll happily show you how bad I am at them. I intended to make this game far simpler than what it is now, but I wanted to push my ideas further and test some game play elements I think will be fun to use in future games. I didn’t even attempt music again, I simply don’t have the confidence for it. I’ve noticed I become greatly annoyed by any jingles I make, kinda like how you sing me Wheels on the Bus while I’m trying to take a poo. Another piece I struggled a lot with was the flame trail. Because it wasn’t set to a dedicated sprite I wasn’t able to get it the attachment quite right, and you’ll notice the flame trail is super jank when the junk comes from the top or bottom. It doesn’t bother me that much though. I’m going to assume you’re at the age where you don’t really care about that stuff, and I’m at the age where I’m just happy you sleep through the night- and let me poo in peace.
Story
Earth has long since been abandoned and has returned to it’s lush greenery. However, this paradise is not for long. With the space defences drifting towards the sun, you are an autonomous satellite who’s purpose long forgotten. Your only objective is to survive the incoming junk that is now crashing into the planet. With only 10 minutes left before the Earth’s demise, your inherit need to for survival remains the primary objective. Once orbit is no longer sustained, who knows where you will go next!
This is my first game submission. If you have played puzzle games on the NES then you will recognize the inspiration here. There are still some bugs to fix, pun intended, but this is nearly complete.
To do:
- Pretty it up with a better title screen and background image
- Maybe a combo based scoring system? I dont care but some people might
- music?

Hey! I've been playing with making a livecoding tool in Picotron.
It is very much inspired by Magpie and Sonic Pi. Basically, I figured out that you could use Lua coroutines to make live loops like in Sonic Pi, and it works quite well!
Basic usage:
- run code with ctrl+enter
- start a line with
:to make a loop (see example code) - by default, a loop runs every frame
syncandsleeptake a division of a bar and suspend the loop. usesync(1/4)to synchronize to quarter notes,sleep(3)to sleep for 3 whole bars, etc.seqfits a sequence into a bar. soseq{1,2,3,4}returns a different value each quarter note, looping each bar
Experience the meaningful work of Macrodata Refinment at LUMON!
Keir be praised! A new refiner is startig work today.
And this time...
... it's YOU!
Your job at LUMEN is to refine data. Find the correct numbers and use the arrow keys to move the cursor. Now all that is left to do is to put the cluster of numbers in the corresponding bin. You have 60 seconds to complete a file.
It's that easy! But don't celebrate just yet: the process of refining is delicate and increasingly difficult. You need a keen eye to spot the clusters.
Your performance will be reviewed by your supervisor, Mr. Milchick. Keir knows you are just a human, so making a mistake is natural. However, more than one mistake can not be tolerated.
Special thanks to Liquidream with his LUMON-8 game. I took some inspirations.
FAQ
Q: Is this a game?
A: It is Microdata Refinement.
Q: Are there rewards?
A: You may be eligible for a pencil. Some refiners have repordetly been offered a handshake with their supervisor as well.
Q: How do I spot the clusters?
A: Look out for floating numbers. Use the arrow-keys to move the cursor onto the clusters. The feeling of these numbers will be revealed to you.
Controls
Arrow Keys = Move Cursor
X = Confirm
O (C/Z) = Cancel

I'm trying to make a basic AABB (axis aligned bounding box) collision system, and I've got it mostly working, I'm just not sure how to implement this last part.
it can detect collisions fine, and mostly resolve them, but if I come at a wall diagonally, it resolves the collision on both axes, and pushes the player to one of the wall's corners. my solution to that currently is to compare the two offsets and zero out the smaller one, but I'm aware there's likely a better way to do it (like bump.lua's collision normals), just not how to implement it.
this is what my code looks like so far
function resolveCol(obj1,obj2)
--calculate x and y overlap, then move them by the correct amount to resolve that.
offsetx = 0
offsety = 0
if obj1.dx == 1 then
offsetx = obj1.x1 - obj2.x0
elseif obj1.dx == -1 then
offsetx = obj1.x0 - obj2.x1
end
if obj1.dy == 1 then
offsety = obj1.y1 - obj2.y0
elseif obj1.dy == -1 then
offsety = obj1.y0 - obj2.y1
end
printh("ox: " .. offsetx)
printh("oy: " .. offsety)
--this is probably a really bad way of doing it, but hey, it works.
--what I'm doing is checking which offset is smaller, and zeroing the other one.
--the square is to account for negative numbers.
if obj1.dx ~= 0 and obj1.dy ~= 0 then
if offsetx^2 < offsety^2 then
offsety = 0
elseif offsety^2 < offsetx^2 then
offsetx = 0
end
end
end
function overlap(obj1,obj2) --both args contain atleast 2 points, comprised of 4 values, x0,y0,x1,y1. x0 and y0 should be top left, x1 and y1 should be bottom right.
if obj1.x1 > obj2.x0 and obj1.x0 < obj2.x1 then
if obj1.y1 > obj2.y0 and obj1.y0 < obj2.y1 then
sfx(0)
return true
end
end
end |






6 comments





