Search code examples
pythonpygamesprite

Update sprite position using arrow keys in pygame


I'm trying to make a sprite move when the arrow keys are pressed (just left and right) but nothing is happening. I've been trying to get this to work but I wasn't able to do it. The sprite gets drawn but it doesn't move, it just stays there. Here's the code:

import pygame
pygame.init()

class Player(pygame.sprite.Sprite):

    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.sprites = []
        self.sprites.append(pygame.image.load('Sprites/Player/running1.png'))
        self.sprites.append(pygame.image.load('Sprites/Player/running2.png'))
        self.sprites.append(pygame.image.load('Sprites/Player/running3.png'))
        self.sprites.append(pygame.image.load('Sprites/Player/running4.png'))
        self.sprites.append(pygame.image.load('Sprites/Player/running5.png'))
        self.sprites.append(pygame.image.load('Sprites/Player/running6.png'))
        self.current_sprite = 0
        self.image = self.sprites[self.current_sprite]
        self.rect = self.image.get_rect()
        self.rect.topleft = [x,y]
        self.x = self.rect.x
        self.y = self.rect.y
        self.walking = False
        self.vel = 5
    
    def walk(self):
        self.walking = True

    def update(self):
        if self.walking == True:
            self.current_sprite += 1         
            if self.current_sprite >= len(self.sprites):
                self.current_sprite = 0
                self.walking = False
            self.image = self.sprites[self.current_sprite]


sWidth = 800
sHeight = 400
screen = pygame.display.set_mode((sWidth,sHeight))
pygame.display.set_caption("Game")
background = pygame.image.load('Sprites/Background/bg1.jpg')

allSprites = pygame.sprite.Group()
player = Player(300,230)
allSprites.add(player)

clock = pygame.time.Clock()
keepGoing = True

while keepGoing:
    clock.tick(20)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            keepGoing = False

Now, I want to have it move whenever I hit an arrow key.

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    player.x -= player.vel

elif keys[pygame.K_RIGHT]:
    player.x += player.vel

else:
    player.walking = False

screen.blit(background, (0,0))
allSprites.draw(background)
allSprites.update()
pygame.display.flip()

Solution

  • The position of the player is stored in self.rect. The rect attribute is used by pygame.sprite.Group.draw to draw the Sprite. Therefore you must update player.rect.x and player.rect.y rather than player.x and player.y. You don't need the attributes x and y at all:

    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player.rect.x -= player.vel
    
    elif keys[pygame.K_RIGHT]:
        player.rect.x += player.vel