Trying to draw a pygame sprite in a class but error comes

Viewed 117

I'm trying to draw a sprite in pygame inside a class however I get an error.

Here is my code:

import pygame

# Initiate Pygame
pygame.init()

# Set The Screen Size
screen = pygame.display.set_mode([800, 600])

# Set The Window Title & Icon
pygame.display.set_caption("Pacman")



# Player
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Pacman_Player.tiff").convert
        self.rect = self.image.get_rect()
        self.draw = screen.blit(self.rect, 200, 200)
    


# Background Image

backImg_1 = pygame.image.load("maze.png").convert()
backImg = pygame.transform.scale(backImg_1, (800, 600))

# Game Loop
running = True

while running:
    # Player
    Player = Player()
    
    # Background Image
    screen.blit(backImg, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

    

Here is the error message I get when I try to run this code:

  File "/Users/nagz/Pacman/Pacman.py", line 34, in <module>
    Player = Player()
  File "/Users/nagz/Pacman/Pacman.py", line 19, in __init__
    self.rect = self.image.get_rect()
AttributeError: 'builtin_function_or_method' object has no attribute 'get_rect'

The error message says that there is no get_rect method in pygame, however in pygame there is a get_rect method.

3 Answers

You'll need to call the Surface.convert() function at

self.image = pygame.image.load("Pacman_Player.tiff").convert

to be

self.image = pygame.image.load("Pacman_Player.tiff").convert()

See the documentation for Surface.convert().


For the new error (provided by the OP in the comments),

File "/Users/nagz/Pacman/Pacman.py", line 34, in <module>
     Player = Player()   File "/Users/nagz/Pacman/Pacman.py", line 20, in __init__
     self.draw = screen.blit(self.rect, 200, 200) 
TypeError: argument 1 must be pygame.Surface, not pygame.Rect

Simply replace

screen.blit(self.rect, 200, 200)

with

color = 255, 0, 0
pygame.draw.rect(screen, color 200, 200, self.rect.w, self.rect.h)
import pygame

# Initiate Pygame
pygame.init()

# Set The Screen Size
screen = pygame.display.set_mode([800, 600])

# Set The Window Title & Icon
pygame.display.set_caption("Pacman")



# Player
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Pacman_Player.tiff").convert()
        self.rect = self.image.get_rect()
        self.draw = screen.blit(self.rect, 200, 200)
    


# Background Image

backImg_1 = pygame.image.load("maze.png").convert()
backImg = pygame.transform.scale(backImg_1, (800, 600))

# Game Loop
running = True

while running:
    # Player
    Player = Player()
    
    # Background Image
    screen.blit(backImg, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

You are missing a () after convert, change it to:

self.image = pygame.image.load("Pacman_Player.tiff").convert()

and change:

self.draw = screen.blit(self.rect, 200, 200)

to

self.draw = lambda: screen.blit(self.image, (200, 200))

this way, you can just call self.draw(), whenever you wanna draw the sprite.

Here’s the code:

import pygame

# Initiate Pygame
pygame.init()

# Set The Screen Size
screen = pygame.display.set_mode([800, 600])

# Set The Window Title & Icon
pygame.display.set_caption("Pacman")



# Player
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load("Pacman_Player.tiff").convert()
        self.rect = self.image.get_rect()
        self.draw = lambda: screen.blit(self.image, (200,200))
    


# Background Image

backImg_1 = pygame.image.load("maze.png").convert()
backImg = pygame.transform.scale(backImg_1, (800, 600))

# Game Loop
running = True

while running:
    # Player
    Player = Player()
    
    # Background Image
    screen.blit(backImg, (0, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
            pygame.quit()

    
Related