I have taken my most recent Pico-8 game Kid Bludd, stripped it down to the essentials, and I am releasing it as a kind of Platforming Game Starter Kit.
I removed all logic that isn't game agnostic, so it is hopefully a good starting point for pretty much any platformer.
It's not super complicated, but does a lot of stuff I see many games not doing, which I consider table stakes for a platformer that feel good.
Features the basics:
- Animation System
- Collision Routines
- Camera (w/Shake)
- But also...
This one is very subtle but one of the most important pieces of a platformer. In general the player can only jump if they are on the ground, but this can make the game feel unresponsive when trying to make precision jumps. To give the player some leeway, the game allows jumps for a few frames after the player leaves a platform, and also registers jump presses if they came a few frames before landing.
When you change direction while moving, there is a bit of a slide before moving in the new direction.
Air and Ground Friction
Tunable values for both how much the player slows down while in the air and when touching the ground. This is critical for allowing the player to land on small platforms, while maintaining a good feeling in the air.
Variable Jump Height
Tap to jump a small amount, and hold to jump higher. Again very critical for precision jumps.
Pass Through Floors
Some floors allow the player to jump up through them, but not down. Really important for any levels with verticality, but also fun for horizontal scrollers.
Camera Scrolling Threshold
This cart uses the same camera style as metroid, where the player must leave a small area in the center of the screen before it starts scrolling. This give the player the freedom to make minor movements without causing nauseating camera movements.
|This is a follow up to my original cart: "Micro Platformer - Simple Platforming Engine in 100 Lines of Code". If you are new to programming, I strongly suggest starting with that cart, as it is much simpler to follow!
:: FROM THE AUTHOR
@ianh: Thanks for reporting the bug! Never seen it before but within 1 minute of trying I was able to do it! I'll try to get a fix in; should be just a matter of adding more collision points on the player's head (to match what is on his feet).
@everyone else: Thanks so much for the positive words! Let me know if you make anything, or have any questions about the engine!
:: FROM THE AUTHOR
Version 1.1 Uploaded:
- Fixes to collision routines (thanks @ianh).
- Camera now follows in Y (not just X).
- Supports sprites of any size (not just 8x8).
Here is a little demo I did of a platformer using 16x16 sprites:
@mhughson I haven't had time to code anything, but this looks like a great foundation for my platformer. Thanks for sharing it!
I noticed a collision error when the player sprite walks all the way left - it overlaps the background a pixel. Is the code collision checking every pixel in the sprite against the background?
@LeeStewart: It does not check for collision on every pixel. It only checks a few points, but the issue you are seeing is because the sprite is not centered and I check the same offset amount on both sides (so on right it is perfect, but on left it is off by one). See function collide_side(self) for more details.
Not sure if anyone really cares, but I got rid of the overlap when colliding left, which @LeeStewart mentioned, by adding 0.5 to the offsets for self.dx<0, in lines 75-80:
--elseif self.dx<0 then if fget(mget((self.x-(offset+0.5))/8,(self.y+i)/8),0) then self.dx=0 self.x=(flr((self.x-(offset+0.5))/8)*8)+8+(offset+0.5) return true end
Thanks for this awesome tool! :D
Thanks again for this library! When using it, I made a modification others might be interested in:
If you want jumpthrough collision to only catch the player if they are actually landing on the TOP of the tile (instead of getting shifted up if they are falling anywhere inside the tile) then you can take this line in collide_floor:
if fget(tile,0) or (fget(tile,1) and self.dy>=0) then
and turn it into these two lines :
local ty = flr(self.y+4)%8
if fget(tile,0) or (fget(tile,1) and self.dy>=0 and ty<=1) then
(you don't actually need the dy >= 0 for any appreciable difference here, so you can actually remove it, but I kept it for consistency)
This adds a check to see if the player's collision bottom is at the border edge of a tile (i.e. collide only when colliding on the TOP of a jumpthrough tile, instead of just anywhere within one)
NOTE: This assumes tiles of 8 height and player collision of 8 tall, with y coordinate at the center (which I believe the rest of the Adv. Platform library does).
Log in to post a comment