0

Basically I am working on a simple platformer and I have all of the basics like the gravity, acceleration, and platforms, but for some reason the character will decelerate going right, but when it goes left it will continue moving slowly instead of stopping. I even printed the value of my variable "changeX" to see what was going on, and it showed me the values I that should be happening rather than what was displayed. Sorry my comments are very limited in their helpfulness. The code regarding variables rect.x , changeX, and accelX are likely the most relevant.

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
BLUE = (50, 50, 255)
# Screen dimensions
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
COLOR = BLUE
#Top Speed
tSpeedX = 7
tSpeedY = 20
#gravity constant
gConstant = 1
#acceleration X variable
accelX = 0
#acceleration Y variable
accelY = 0
#whether you can jump or not
jumpB = True
class player(pygame.sprite.Sprite):

    def __init__(self, x, y):
        super().__init__()
        #iniatilized values for rect
        self.image = pygame.Surface([50, 50])
        self.image.fill(COLOR)

        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.changeX = 0
        self.changeY = 0
        self.walls = None
    #the velocity function. X and Y values are assigned based on the accelX
    #and Y constants and added to the points of the rectangle
    def velocity(self,x,y):
        #change in speed
        self.changeX += x
        self.changeY += y
        if abs(self.changeX) >= tSpeedX:
            self.changeX = self.changeX/abs(self.changeX) * tSpeedX
        if abs(self.changeY) >= tSpeedY:
            self.changeY = self.changeY/abs(self.changeY) * tSpeedY
#standard update function. Will update rectangles position and deaccelerate it if no key held
    def jump(self,y):
        self.changeY = y
    def update(self):
        if accelX == 0:
            self.changeX *= 0.92
        if accelY == 0:
            self.changeY *= .95

        self.rect.x += self.changeX
        print(self.changeX)
        block_hit_list = pygame.sprite.spritecollide(self, self.walls, False)
        for block in block_hit_list:
            if self.changeX > 0:
                self.rect.right = block.rect.left
            else:
                self.rect.left = block.rect.right
        self.rect.y += self.changeY + (9*gConstant)
        block_hit_list = pygame.sprite.spritecollide(self, self.walls, False)
        for block in block_hit_list:
            if self.changeY >= -5:
                global jumpB
                jumpB = True
                COLOR = WHITE
                self.rect.bottom = block.rect.top

            else:
                self.rect.top = block.rect.bottom



class wall(pygame.sprite.Sprite):
    def __init__(self, sx, sy,px,py):
        super().__init__()
        #iniatilized values for walls
        collision = False
        self.image = pygame.Surface([sx, sy])
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.x = px
        self.rect.y = py

pygame.init()
screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
spriteList = pygame.sprite.Group()
wallList = pygame.sprite.Group()
Player = player(100,100)
spriteList.add(Player)
Wall1 = wall(1000, 30, 0, 400)
Wall2 = wall(100, 30, 150, 350)
wallList.add(Wall2)
spriteList.add(Wall2)
wallList.add(Wall1)
spriteList.add(Wall1)
Player.walls = wallList

clock = pygame.time.Clock()
#Allows program to exit
quit = False
while not quit:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit = True
        #Sets accel values
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                accelX  = -.25
            if event.key == pygame.K_RIGHT:
                accelX = .25
            if event.key == pygame.K_UP and jumpB == True:
                Player.jump(-20)
                jumpB = False
                COLOR = BLUE
            if event.key == pygame.K_DOWN:
                accelY = .25
        #reverses accel values to allow for deaccleration
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT:
                accelX = 0
            if event.key == pygame.K_RIGHT:
                accelX = 0
            if event.key == pygame.K_UP:
                accelY = 0
            if event.key == pygame.K_DOWN:
                accelY = 0
    #calls function to move rectangle
    Player.velocity(accelX, accelY)

    spriteList.update()
    screen.fill(BLACK)
    spriteList.draw(screen)
    pygame.display.flip()
    clock.tick(60)
  • The line I see that could produce different behavior depending on whether you're moving left or right is `if self.changeX > 0:`. Should 0 be handled specially to make sure that when `changeX` reaches 0 while you're moving left, you come to a full stop? – Samwise Nov 24 '20 at 01:11
  • @Samwise the ``` if self.changeX > 0``` is not related to movement. It is used for collisions. With or without that piece of code the problem still persists. – Purple Shrimp Nov 24 '20 at 01:16
  • Very likely the same issue as [Simple drag physics, acting differently when moving left or right](https://stackoverflow.com/questions/64977010/simple-drag-physics-acting-differently-when-moving-left-or-right/64977138#64977138) – Rabbid76 Nov 24 '20 at 05:46

0 Answers0