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()
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