Search code examples
pythonpygamesprite

Cant move sprite on screen


The sprite is just stuck in the top left corner. It moves sligthly when pressing "wasd". I am trying to make a simple clone of Mayhem/xPilot. A 2 player game where there are 2 rockets that can shoot eachother down.

I am fairly new to coding and python, I would be gratefull if you could ELI5. Has anyone else had this problem?

import pygame as pg
    import sys
    x, y = 0, 0
    
    
    class Rocket(pg.sprite.Sprite):
        def __init__(self, picture_path, x, y):
            super().__init__()
            self.image = pg.image.load(picture_path)
            self.image = pg.transform.scale(self.image, (120, 100))
            self.rect = self.image.get_rect()
            self.rect.x = 900
            self.rect.y = 400
            self.pressed_w = False
            self.pressed_a = False
            self.pressed_s = False
            self.pressed_d = False
            self.speed = 3
            self.gravity = False
    
        def update(self):
            self.rect.x = 0
            self.rect.y = 0
            if self.pressed_a and self.rect.left > 0:
                self.rect.x = self.speed
            if self.pressed_d and self.rect.right < width:
                self.rect.x = self.speed
            if self.pressed_s and self.rect.bottom < height:
                self.rect.y = self.speed
            if self.pressed_w and self.rect.top > 0:
                self.rect.y = -self.speed
            if self.gravity and self.rect.bottom < height:
                self.rect.y = self.speed
    
            self.rect.x += x
            self.rect.y += y
    
    
    
    
    
    
    pg.init()
    clock = pg.time.Clock()
    
    width = 1920
    height = 1080
    screen = pg.display.set_mode((width, height))
    background = pg.image.load("bg.jpg")
    
    
    #rocket
    player_rect = Rocket("rocket.png", x, y)
    rocket_group = pg.sprite.Group()
    rocket_group.add(player_rect)
    
    
    while True:
        for event in pg.event.get():
            if event.type == pg.QUIT:
                pg.quit()
                sys.exit()
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_w:
                    player_rect.pressed_w = True
                    player_rect.gravity = False
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_s:
                    player_rect.pressed_s = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_d:
                    player_rect.pressed_d = True
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_a:
                    player_rect.pressed_a = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_w:
                    player_rect.pressed_w = False
                    player_rect.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_s:
                    player_rect.pressed_s = False
                    player_rect.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_d:
                    player_rect.pressed_d = False
                    player_rect.gravity = True
            if event.type == pg.KEYUP:
                if event.key == pg.K_a:
                    player_rect.pressed_a = False
                    player_rect.gravity = True
    
        pg.display.flip()
        screen.blit(background, (0, 0))
        rocket_group.draw(screen)
        rocket_group.update()
        clock.tick(120)

Solution

  • The problem is in the update method. The method has to change the coordinates of the rect attribute. However, your method continuously sets self.rect.x = 0 and self.rect.y = 0.
    Change update:

    class Rocket(pg.sprite.Sprite):
        # [...]
    
        def update(self):
            if self.pressed_a:
                self.rect.x -= self.speed
            if self.pressed_d
                self.rect.x += self.speed
            if self.pressed_w
                self.rect.y -= self.speed
            if self.pressed_s
                self.rect.y += self.speed
            if self.gravity
                self.rect.y += self.speed
    
            if self.rect.left < 0: self.rect.left = 0  
            if self.rect.right > width: self.rect.right = width 
            if self.rect.top < 0: self.rect.top = 0  
            if self.rect.bottom > height: self.rect.bottom = height