# Jump and run in Pygame

In this article you will learn how to implement jump and run logic in Pygame. To do so, we will implement the player logic.

Movement
Moving left and right is similar to the previous tutorial and simply mean changing the (x,y) position of the player. For jumping, we use a formula from classical mechanics:

`F = 1/2 * m * v^2`

Where F is the force up/down,  m is the mass of your object and v is the velocity. The velocity goes down over time because when the player jumps the velocity will not increase more in this simulation.   If the player reaches the ground, the jump ends. In Python, we set a variable isjump to indicate if the player is jumping or not. If the player is, its position will be updated according to the above formula.

Full Code:

```from pygame.locals import * import pygame import math from time import sleep   class Player: x = 10 y = 500 speed = 10   # Stores if player is jumping or not. isjump = 0   # Force (v) up and mass m. v = 8 m = 2   def moveRight(self): self.x = self.x + self.speed   def moveLeft(self): self.x = self.x - self.speed   def jump(self): self.isjump = 1   def update(self): if self.isjump: # Calculate force (F). F = 0.5 * mass * velocity^2. if self.v &gt; 0: F = ( 0.5 * self.m * (self.v*self.v) ) else: F = -( 0.5 * self.m * (self.v*self.v) )   # Change position self.y = self.y - F   # Change velocity self.v = self.v - 1   # If ground is reached, reset variables. if self.y &gt;= 500: self.y = 500 self.isjump = 0 self.v = 8     class App:   windowWidth = 800 windowHeight = 600 player = 0   def __init__(self): self._running = True self._display_surf = None self._image_surf = None self.player = Player()   def on_init(self): pygame.init() self._display_surf = pygame.display.set_mode((self.windowWidth,self.windowHeight), pygame.HWSURFACE)   pygame.display.set_caption('Pygame pythonspot.com example') self._running = True self._image_surf = pygame.image.load("pygame.png").convert()   def on_event(self, event): if event.type == QUIT: self._running = False   def on_loop(self): pass   def on_render(self): self._display_surf.fill((0,0,0)) self._display_surf.blit(self._image_surf,(self.player.x,self.player.y)) self.player.update() pygame.display.flip() sleep(0.03)   def on_cleanup(self): pygame.quit()   def on_execute(self): if self.on_init() == False: self._running = False   while( self._running ): pygame.event.pump() keys = pygame.key.get_pressed()   if (keys[K_RIGHT]): self.player.moveRight()   if (keys[K_LEFT]): self.player.moveLeft()   if (keys[K_UP]): self.player.jump()   if (keys[K_ESCAPE]): self._running = False   self.on_loop() self.on_render() self.on_cleanup()   if __name__ == "__main__" : theApp = App() theApp.on_execute()```

If you want to jump on objects, simply add them to the screen, do collision detection and reset the jump variables if collision is true.

## 3 thoughts on “Jump and run in Pygame”

1. - August 9, 2015

Very helpful tutorial for understanding pygame programming.

Your physics is a little off. Force, F = ma. The expression 1/2 * m * v^2 is kinetic energy not force. But what you really want to do is calculate the change in the vertical y-coordinate for constant gravity acceleration while jumping. The change in y-coordinate is given by dy = v * dt, where dt is the constant time step. The vertical velocity, v, does decrease linearly due to constant acceleration (because v = at) as your example program does. But the F term should be proportional to v not v^2. If you change (self.v*self.v) to (self.v) you don’t need the if/else because the expression proportional to self.v changes sign with self.v. Mass doesn’t play into vertical velocity (ignoring air drag) as all objects are accelerated by gravity at the same rate.

To keep changes to a minimum, I replaced the “if self.v>0” expression for F with one line:
F = ( self.m * self.v)
Then I changed self.m = 8 to make jump height about same as original.

Changing the code that handles the jump physics results in a nice parabolic jump as in real world physics. The velocity squared physics rises quickly initially and hovers at the top of the arc longer. That may be desirable for some games, but it isn’t how jumping works in the real world.

1. - August 10, 2015

Thanks John! I will update the code when I finished the to-do list

2. - May 29, 2015