title: Player gliding and platforms not moving correctly (Python/Pygame)
body: <p>I'm currently building a small plat former for my A-Level project and have ran into an issue that I or my friends cant solve. The player seems to glide a lot to the right and not to the left (note: the small glide on the left is whats needed) and platforms seem to not move correctly either, some do as needed like the walls but then floors don't and everything clips to the right side of the screen. Any suggestions would be helpful.</p>
  
  <pre><code>import pygame as pg
  import random
  import time
  vec = pg.math.Vector2
  #Player Props
  PLAYER_ACC = 1.5
  PLAYER_FRICTION = -0.12
  PLAYER_GRAV = 0.8
  #Display
  WIDTH = 1800
  HEIGHT = 1000
  #Colours
  WHITE = (225,225,255)
  BLACK = (0,0,0)
  RED = (225,0,0)
  BLUE = (0,0,225)
  PURPLE = (95, 11, 239)
  ORANGE = (250,123,10)
  
  class Player(pg.sprite.Sprite):
      def __init__(self, game):
          #Player spawn and location
          pg.sprite.Sprite.__init__(self)
          self.game = game
          self.image = pg.Surface((32, 32))
          self.image.fill(PURPLE)
          self.rect = self.image.get_rect()
          self.pos = vec(WIDTH/2, 200)
          self.vel = vec(0, 0)
          self.acc = vec (0, 0)
  
      def jump(self):
          #Jumping  when standing on playform
          self.rect.x += 1
          hits = pg.sprite.spritecollide(self, self.game.platformsA, False)
          self.rect.x -= 1
          if hits:
              self.vel.y = -20
  
      def update(self):
          #Player Movement/Gravity
          self.acc = vec (0, PLAYER_GRAV)
          self.vy = 1
          keys = pg.key.get_pressed()
          if keys[pg.K_LEFT]:
              self.acc.x = -PLAYER_ACC 
          if keys[pg.K_RIGHT]:
              self.acc.x = PLAYER_ACC 
          #Accelaration/Friction
          self.acc.x += self.vel.x * PLAYER_FRICTION
          self.vel += self.acc
          if self.vel[1]&gt; 10:
              self.vel[1] = 10
          self.pos += self.vel + 0.25 * self.acc
          self.rect.midbottom = self.pos
  
  
  class Platform(pg.sprite.Sprite):
      def __init__(self, x, y, w, h):
          #Building Platforms
          pg.sprite.Sprite.__init__(self)
          self.image = pg.Surface((w, h))
          self.rect = self.image.get_rect()
          self.image.fill(WHITE)
          self.rect.x = x
          self.rect.y = y
  
  
  class Game:
      def __init__(self):
          #initialize game window etc
          pg.init()
          pg.mixer.init()
          self.screen = pg.display.set_mode((WIDTH, HEIGHT))
          self.screen.fill(BLACK)
          pg.display.update()
          pg.display.set_caption('Fur-Rush')
          self.clock = pg.time.Clock()
          self.running = True
  
      def new(self):
          #start new game/spawn everything
          self.all_sprites = pg.sprite.Group()
          self.platforms = pg.sprite.Group()
          self.platformsA = pg.sprite.Group()
          self.platformsB = pg.sprite.Group()
          self.platformsWa = pg.sprite.Group()
          self.platformsWb = pg.sprite.Group()
          self.player = Player(self)
          self.all_sprites.add(self.player)
          #Read platform dimensions from platforms.txt
          with open ('platforms.txt','r') as me:
              allplat = (me.read().split('\n'))
              newplat = [x.replace(',','').split(' ') for x in allplat]
          #Recursive loop to add platforms
          for x in range(len(newplat)):
              name = str(newplat[x][0])
              plat = Platform(int(newplat[x][1]), int(newplat[x][2]), int(newplat[x][3]), int(newplat[x][4]))
              self.all_sprites.add(plat)
              self.platforms.add(plat)
              if 'A' in str(name):
                  self.platformsA.add(plat)
              elif 'B' in str(name):
                  self.platformsB.add(plat)
              elif 'Wa' in str(name):
                  self.platformsWa.add(plat)
              elif 'Wb' in str(name):
                  self.platformsWb.add(plat)
          self.run()
  
      def run(self):
          #game loop
          self.playing = True
          while self.playing:
                  self.clock.tick(60)
                  self.events()
                  self.update()
                  self.draw()
  
      def update(self):
          #game loop - update
          self.all_sprites.update()
          #Top of platform
          hits = pg.sprite.spritecollide(self.player, self.platformsA, False)
          if hits:
              self.player.pos.y = hits[0].rect.top
              self.player.vel.y = 0
          #Bottom of platform
          hits2 = pg.sprite.spritecollide(self.player, self.platformsB, False)
          if hits2:
              self.player.pos.y = (hits2[0].rect.top + 42)
              self.player.vel.y = 0
          #Walls for left dectection
          hits3 = pg.sprite.spritecollide(self.player, self.platformsWa, False)
          if hits3:
              self.player.pos.x = (hits3[0].rect.right+16)
              self.player.vel.x = 0
          #Walls for right dectection
          hits4 = pg.sprite.spritecollide(self.player, self.platformsWb, False)
          if hits4:
              self.player.pos.x = (hits4[0].rect.left - 16)
              self.player.vel.x = 0
  
          #moving camra/display with player
              #left
          if self.player.rect.left &lt;= WIDTH/3:
              self.player.pos.x += abs(self.player.vel.x)
              for plat in self.platforms:
                  plat.rect.x += abs(self.player.vel.x)
  
              #right (ISSUES)
          if self.player.rect.right &gt;=WIDTH/1.5:
              self.player.pos.x -= abs(self.player.vel.x)
              for plat in self.platforms:
                  plat.rect.x -= abs(self.player.vel.x)
  
              #bottom
          if self.player.rect.top &gt;= HEIGHT/1.25:
              self.player.pos.y += 0.1
              for plat in self.platforms:
                  plat.rect.y -= 7
  
              #top
          if self.player.rect.bottom &lt;= HEIGHT/5:
              self.player.pos.y -= 0.1
              for plat in self.platforms:
                  plat.rect.y += 7
  
      def events(self):
          #game loop - events
          for event in pg.event.get():
              #check for closed window
              if event.type == pg.QUIT:
                  if self.playing:
                      self.playing = False
                  self.running = False
              if event.type == pg.KEYDOWN:
                  if event.key == pg.K_UP:
                      self.player.jump()
  
      def draw(self):
          # Game loop draw
          self.screen.fill(BLACK)
          self.all_sprites.draw(self.screen)
          #after drawing everything, flip
          pg.display.flip()
  
      def show_start_screen(self):
          #start screen
          pass
  
      def show_end_screen(self):
          #Level end screen
          pass
  
  g = Game()
  g.show_start_screen()
  while g.running:
      g.new()
      g.show_end_screen()
  
  pg.quit()
  </code></pre>
  
  <p>file needed to run code must be called "platforms.txt" and have the following:</p>
  
  <pre><code>plA, -300, 126, 1500, 10
  plB, -300, 136, 1500, 10
  plA2, -300, 536, 1100, 10
  plB2, -300, 546, 1100, 10
  plA3, -100, 336, 1300, 10
  plB3, -100, 346, 1300, 10
  plA4, 1000, 536, 200, 10
  plB4, 1000, 546, 200, 10
  plA5, 800, 1526, 200, 10
  plB5, 800, 1536, 200, 10
  plWa, -300, 136, 20, 400
  plWb, 1180, 136, 20, 400
  plWa2, 800, 546, 20, 1000
  plWb2, 1000, 546, 20, 1000
  </code></pre>