Pygame, Python 2.7, AttributeError: type object 'newPlayer' has no attribute 'rect', but I declared a rect attribute

StackOverflow https://stackoverflow.com/questions/19547476

Question

So I'm making a player object in pygame, and I had a sprite loader load up the image, set the object to have that image, and get a rectangle object of it.

However, when I try to test it out in main I get this error

AttributeError: type object 'newPlayer' has no attribute 'rect'

But I have this line in my newPlayer class

self.rect = self.image.get_rect()

What is going on? I have had near-identical code with other objects in the game, and they worked without issue.

Full code:

import pygame

# Define some colors
black    = (   0,   0,   0)
white    = ( 255, 255, 255)
red      = ( 255,   0,   0)

#initialize pygame
pygame.init()

#set the height and width of the screen
width = 800
height = 480

mainScreen = pygame.display.set_mode([width,height])

#A list of all of the sprites in the game
all_sprites_list = pygame.sprite.Group()


def sprite_sheet_load(colorKey, spriteLocX, spriteLocY, spriteSizeX, spriteSizeY, fileName):
    '''Purpose: to extract a sprite from a sprite sheet at the chosen location'''
    '''credit to SO user hammyThePig for original code'''

    sheet = pygame.image.load(fileName).convert() #loads up the sprite sheet. convert makes sure the pixel format is coherent
    sheet.set_colorkey(colorKey) #sets the color key

    sprite = sheet.subsurface(pygame.Rect(spriteLocX, spriteLocY, spriteSizeX, spriteSizeY)) #grabs the sprite at this location

    return sprite

class newPlayer(pygame.sprite.Sprite):
    '''class that builds up the player'''
     #constructor function
    def __init__(self): #create a self variable to do stuff

        #call up the parent's constructor
        pygame.sprite.Sprite.__init__(self)

        img = "mainCharacterFinal.png"

        #size of each sprite
        sprite_sizeX = 35
        sprite_sizeY = 37

        #List of images for different types of movement
        self.imagesLeft = []

        self.imagesRight = []

        self.imagesUp = []

        self.imagesDown = []

        #these two variables go and help reset the position variables of the sprites
        xInit = 35
        yInit = 37

        #inital positions of sprites on the sheet
        positionX = 0
        positionY = 0

        colorKey = white #colorKey to pass to the function

        self.imagesUp.append(sprite_sheet_load(black, positionX, positionY, sprite_sizeX, sprite_sizeY, img))


        #the best image to use by default is the one that has the player facing the screen.
        self.image=self.imagesUp[0]


        self.rect = self.image.get_rect()

newplayer = newPlayer()
all_sprites_list.add(newplayer)
newPlayer.rect.x = 300
newPlayer.rect.y = 300

#a conditional for the loop that keeps the game running until the user Xes out
done = False

#clock for the screen updates
clock = pygame.time.Clock()


while done==False:
    for event in pygame.event.get(): #user did something
        if event.type == pygame.QUIT: #if the user hit the close button
                done=True

    mainScreen.fill(white)#makes the background white, and thus, the white part of the images will be invisible

    #draw the sprites
    all_sprites_list.draw(mainScreen)

    #limit the game to 20 fps
    clock.tick(20)

    #update the screen on the regular
    pygame.display.flip()

pygame.quit()
Was it helpful?

Solution

You have to write

    newplayer 

instead of newPlayer in the respective place. This is because rect is attribute of the instance of the class and not the class itself, when you try to write

    newPlayer.rect 

you are trying to access the rect attribute of newPlayer class which is not there, so you have to write

    newplayer.rect

try

    newplayer.rect.x = 300
    newplayer.rect.y = 300

Check the follwoing link:- Python: Difference between class and instance attributes

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top