Learn to Code via Tutorials on Repl.it!

← Back to all posts
How to make a platformer
h
SeamusDonahue

So some of you might be wondering how to make a platformer...

Although this tutorial is more over the methods of how I do it, it will use pygame as an example.

You want to make sure that you use some lang with oop to make this a lot easier. Your player should have a defined size (although it can change later, its just easier to have width/height vars) and you should know how to do rect collisions given your language/framework.

Basic horizontal movement

in your lang/framework you should have a way to get the keys pressed. in pygame the method I use and recommend is keys = pygame.key.get_pressed().
The best way I found to handle movement is make a variable called move and assign it to rightKey-leftKey. in pygame (using the previously mention method) you can use move = keys[K_d]-keys[K_a] (ofc the things inside the square brackets depends on what keys you want the player to use). this is a really simple way of handling which direction the player is going. It can return 1, -1, or 0. It acts as a xor gate (exclusive or, this or that but not both). if right is held, 1 is returned, left = -1, and both/nothing = 0.

its good practice to have some sort of walkSpeed variable, however not technically needed, if you ever need to change it especially in code with a powerup or something, its way easier if you have some walk speed variable in the init of the object (or however you language defines object variables).

to move the player simply modify the players x by move*walkSpeed... but wait! that doesn't collide with any walls!

collision

to collide with walls you need to setup another variable hsp (Horizontal Speed). this lets us predict where the player is going so we can keep them from going inside of a block. this also lets us add acceleration, but lets not get ahead of ourselves, thats coming in a bit.

something in pygame you also must do is make a list of wall rects (one could also make a list of wall objects and use them in a for statement but pygame.Rect.collidelist is more optimized) this way the player can check collision for all the walls

this is the code I use for collision (in pygame):

something I must clarify before explaining the code is what sign is. sign is not in python by default I define the functions as this:

what that does is returns the sign (positive or negative) in the form of 1,0, or -1.

back to the code earlier.
if pygame.Rect(self.x+self.hsp,self.y,self.w,self.h).collidelist(wallRects) != -1
this checks to see if your x + horizontal speed is in a wall.

when we decide we are about to collide, we don't want to stop short of the obstacle. This loop lets use move the player to the obstacle before resetting the speed

self.x += self.hsp
this moves the player by our horizontal speed.

the same can be done for vertical movement (using vsp instead).

keep in mind that in pygame y = 0 is the top and positive y is down, so you need to do self.y -= self.vsp instead of +

jumping

to add jumping we need to do two things: add gravity and check if the player is on the ground.

to add the ground check, simply check for a ground peice directly below the player

that will check one pixel below the player for any ground.

so if your on the ground and holding a jump key, make our vsp some jump value.

but we want gravity so we add this:

so we are not on the ground we want to make our vsp go down by a gravity value.

acceleration

using this function you can make smooth acceleration:

this function goes toward goal by amm without going over

to use this just edit self.hsp = self.move*walkSpeed to `self.hsp += approach(self.hsp,self.walksp*move,accel)
this lets us approach our walk speed in increments of accel

and there you have it! basic platformer movement! do what you want with it. Hope to see more people make things like this!

hope this helped you, have a nice day

Voters
JoannaTripp
OsvaldoRuiz1
ZacharyShifrel
MariaMorley_Hal
ClaudiuGeorge
BenMonta
Delegatverd
ThijsWesterneng
SudhanshuMishra
SamitaParajuli
Comments
hotnewtop
Bookie0

Try adding syntax highlighting on those markdown code blocks by adding py after the 3 backslashes (`) :)

SeamusDonahue

great idea, I didn't know that applied here, I thought it was just discord. @Bookie0

Cepter

how to playyyyyyyyyy

SeamusDonahue

the repl uses ad and space but you can use whatever controls you want if you make a platformer yourself @Cepter

SudhanshuMishra

COOL i have some experience with pygame btw this is great

SeamusDonahue

thanks! hope this helped you! @SudhanshuMishra

SudhanshuMishra

@SeamusDonahue yes it helped :)