Skip to content Skip to sidebar Skip to footer

Pygame Sprite Not Moving

I'm faced with a logic error where the sprite simply doesn't move regardless of input. My code will be below so no context is left out, it's fairly short. Is there a better way of

Solution 1:

First of all, you are creating a new player every iteration of your main loop:

...
whiledone == False:
    player = Player()
    ...

You want to create the player once, so move the creation outside the loop:

...
player = Player()
while not done:
    ...

Second: To get the position of the player, you use player.pos:

...
screen.blit(player.image, player.pos)
...

but you never update player.pos (it's always (350,200)), you only change self.rect:

defupdate(self):
    newpos=self.rect.move(self.movepos)
    ifself.area.contains(newpos):
        self.rect=newpos
    pygame.event.pump()

either use player.rect to get the player position, or update player.pos accordingly:

defupdate(self):
    newpos=self.rect.move(self.movepos)
    ifself.area.contains(newpos):
        self.rect = newpos
        self.pos = self.rect.topleft
        # don't call pygame.event.pump() here. Doesn't make any sense :-)

Third, you update the player position in the update function, but you never call it. Call it before drawing the player:

...
while not done:
    ...
    player.update()
    screen.fill(white)
    screen.blit(player.image, player.pos)
...

You can simplify your code alot by setting movepos directly and removing the move... functions.

working example:

import pygame
pygame.init()
colors = pygame.color.THECOLORS
screen = pygame.display.set_mode([700,400])

classPlayer(pygame.sprite.Sprite):
    def__init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.surface.Surface((32,32))
        self.image.fill(colors['green'])
        self.rect = self.image.get_rect().move(350, 200)
        self.speed = 4defupdate(self):
        dx, dy = self.movepos[0] * self.speed, self.movepos[1] * self.speed
        self.rect = self.rect.move(dx, dy)


done=False
clock = pygame.time.Clock()
player = Player()

whilenot done:

    if pygame.event.get(pygame.QUIT):
        break

    pressed = pygame.key.get_pressed()
    l, r, u, d = [pressed[k] for k in pygame.K_a, pygame.K_d, pygame.K_w, pygame.K_s]
    player.movepos = -l + r, -u + d
    player.update()

    screen.fill(colors['white'])
    screen.blit(player.image, player.rect.topleft)
    pygame.display.flip()

    clock.tick(60)

Solution 2:

You have a lot of move functions. Try combining them into a simple two function class like this example:

classPuck(pygame.sprite.Sprite):def__init__(self, image_file, speed, location):
        pygame.sprite.Sprite.__init__(self)  #call Sprite initializerself.image = pygame.image.load(image_file)
        self.rect = self.image.get_rect()
        self.rect.left, self.rect.top = location

The two main controllers are the self.rect.left and self.rect.top. By changing their values, you can move the sprites like in this example.

#Name of varible# = Puck('#Image File#', [#value of self.rect.left#, value of self.rect.top]

Then you can use events to change them like:

foreventin pygame.event.get():
    ifevent.type==pygame.QUIT:
        pygame.quit()
        exit(0)
    elif event.type == pygame.KEYDOWN:
        ifevent.key == K_UP:
            random.rect.top =random.rect.top - 75
        elif event.key == K_LEFT:
            random.rect.left = random.rect.left - 75
        elif event.key == K_DOWN:
            random.rect.top = random.rect.top + 75
        elif event.key == K_RIGHT:
            randoml.rect.left = randoml.rect.left + 75
        elif event.key == K_w:
            random.rect.top = random.rect.top - 50
        elif event.key == K_a:
            random.rect.left = random.rect.left - 50
        elif event.key == K_s:
            random.rect.top = random.rect.top + 50
        elif event.key == K_d:
            random.rect.left = random.rect.left + 50

This should be able to move your sprite.

Post a Comment for "Pygame Sprite Not Moving"