尝试在pygame中的for循环中创建对象并获取AttributeError:'FoodItems'对象没有属性'add_internal'

时间:2019-07-09 08:29:31

标签: python pygame

基本上我正在尝试编写一些在屏幕上显示食物的代码,并使用类结构创建这些对象。然后将它们放在一个sprite组中,然后将其显示在屏幕上。屏幕但是在运行代码时出现此错误:

  

回溯(最近通话最近一次):文件“ N:/ Y12 / Computer”   科学/消费/消费V8.5.py”,第172行,在       menuScreen()在menuScreen中的第113行,文件“ N:/ Y12 / Computer science / Consumo / Consumo V8.5.py”       button(“ Play Game”,850,340,120,50,blue,gameLoop)#在屏幕上放置三个按钮“ N:/ Y12 / Computer science / Consumo / Consumo   V8.5.py”,行99,在按钮中       action()在gameLoop中的第160行,文件“ N:/ Y12 / Computer science / Consumo / Consumo V8.5.py”       allSprites.add(food)添加文件“ C:\ Python33 \ lib \ site-packages \ pygame \ sprite.py”,行378       sprite.add_internal(self)AttributeError:“ FoodItems”对象没有属性“ add_internal”

这是我的代码,我想知道是否有人可以帮助我修复此错误,因为我什至不知道该错误意味着什么。

    #Imports the libaries I will use 
    import pygame,time,random
    pygame.init()

    #Sets up the variables for the screen size 
    displayWidth = 1000
    displayHeight = 600
    weight = 0
    lives = 0 
    clock= pygame.time.Clock()

    #sets up the variables for the colours 
    black = (0 ,0 ,0)
    red = (200 ,0 ,0)
    grey = (128 ,128 ,128)
    blue = (0, 0, 200)
    green= (0,255,0)

    #Sets up the images and re-sizes them and also adds the music file
    character =pygame.image.load("character.png")
    character = pygame.transform.scale(character,(60,60))
    sumo = pygame.image.load("sumo .jpg")
    sumo = pygame.transform.scale(sumo,(60,60))

    #both background images are set to displayHeight,displayWidth so they fit the screen
    dojoBackDrop = pygame.image.load("dojo.png")
    dojoBackDrop = pygame.transform.scale(dojoBackDrop,(displayWidth,displayHeight))
    menuBackDrop =  pygame.image.load("menu screen .png")
    menuBackDrop = pygame.transform.scale(menuBackDrop,(displayWidth,displayHeight))

    foodSizeX = 45#I have set up a variable to re-size all the images to as 
    foodSizeY = 45
    0#I want them to be the same size 
    #loads all the food images for my food 
    apple = pygame.image.load("Apple .png")
    apple = pygame.transform.scale(apple,(foodSizeX,foodSizeY))
    fish  = pygame.image.load("Fish.png")
    fish = pygame.transform.scale(fish,(foodSizeX,foodSizeY))
    rice = pygame.image.load("Rice_fresh.png")
    rice = pygame.transform.scale(rice,(foodSizeX,foodSizeY))


    rottenApple = pygame.image.load("rottenapple.png")
    rottenApple = pygame.transform.scale(rottenApple,(foodSizeX,foodSizeY))
    rottenFish = pygame.image.load("rottenfish.png")
    rottenFish = pygame.transform.scale(rottenFish,(foodSizeX,foodSizeY))

    rottenRice = pygame.image.load("rottenrice.png")
    rottenRice = pygame.transform.scale(rottenRice,(foodSizeX,foodSizeY))

    #loads the music which will be playing during the game
    #file has been converted from mp3 to ogg as python can't read mp3 
    #backGroundMusic = pygame.mixer.Sound("Bully Scholarship Edition Soundtrack - Arcade Game - ConSumo (Game) (1).ogg")
    #sets up the pygame window with height and width variables created above 
    gameDisplay = pygame.display.set_mode((displayWidth,displayHeight))
    images =[apple,rice,fish]


    class FoodItems:
        def __init__(self,weightIncrease,xChange,yChange): 
            pygame.sprite.Sprite.__init__(self)
            self.weightIncrease = weightIncrease


            #sets attributes for the class by using the self
                        # this is so they can be set to What I chose 

            self.image  = random.choice(images)
            self.rect= self.image.get_rect()
            self.rectX  = random.randrange(displayWidth - self.rect.width) #creates a hit box for my object 
            self.rectY  = random.randrange(displayHeight-self.rect.height)
            self.xChange = xChange # sets a random speed for x and y 
            self.yChange = yChange
        def update():#conitnusly updates the sprite on the screen 

            self.rectX +=  self.xChange
            self.rectY += sel.yChange #keeps moving the objects
            if self.rectx > displayHeight +10:
                self.rect.x = random.randrange(displayWidth-self.rect.width)
                self.rect.y = random.randrange(displayHeight-self.rect.height)
                                        #this will make the object be able to move

    allSprites=pygame.sprite.Group()#creates a group of sprites on the screen 





    def textObjects(text,font):#passes parameters by value
        textSurface = font.render(text,True,black)#renders the font and sets the color as black
        return textSurface,textSurface.get_rect()#gets the dimensions of the text  

    def button(msg,x,y,w,h,c,action=None):#passes the parameters by value  
        mouse = pygame.mouse.get_pos()#this gets the postion of the mouse
        click = pygame.mouse.get_pressed()#checks to see where the mouse has been clicked
        pygame.draw.rect(gameDisplay, c,(x,y,w,h))#draws a rectangle with on the game display with the parameters given
        if x+w > mouse[0] >x and y+h > mouse[1] > y:#checks to see if the mouse has been clicked anywhere in the button 
            if click[0] == 1 and action != None:#if the mouse has been clicked performed an action 
                action()
        smallText = pygame.font.SysFont("comicsansms",20)
        textSurf , textRect = textObjects(msg ,smallText)
        #sets the message of the button
        textRect.center = ((x+(w/2),(y+(h/2))))#centers the text on screen 
        gameDisplay.blit(textSurf, textRect)#puts the button on screen with the text 

    def menuScreen():
        screenOn = True 
        while screenOn ==True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:#allows user to quit the game
                    quit()
                gameDisplay.blit(menuBackDrop,(0,0))#sets the image to the size of the screen
                button("Play Game",850,340,120,50,blue,gameLoop)#Puts theree button on the screen 
                button("Leaderboard",850,440,120,50,blue)
                button("Quit game",850,540,120,50,blue)
                pygame.display.update()#updates the screen so things can appear on it

    def gameLoop():
        #backGroundMusic.play()
        playerX =500  #used to set the characters position as the center of the screen 
        playerY = 300
        playerXChange = 0#value at which x and ywill change when a Key is pressed                          
        playerYChange = 0
        playing = True #boolean so that the while loop knows when to run till 
        while playing ==True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:#allows user to quit the game
                    quit()
            #if any key is pressed perfomr an action 
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_a:#if   A is pressed move ten to the left 
                        playerXChange = -5
                    elif event.key == pygame.K_d:#if D is pressed move ten to the right 
                        playerXChange = 5
                    elif event.key == pygame.K_w:#if  W is pressed move ten up 
                        playerYChange = -5 
                    elif event.key == pygame.K_s:#if S is pressed move ten down
                        playerYChange = 5

                if event.type ==pygame.KEYUP:
                    playerXChange =0
                    playerYChange =0

            if playerX < 0: #if players x value is less than set it to zero
                playerX = 0
            if playerX >940:#if players x value is greater than 940 than set it to 940
                playerX = 940
            if playerY < 0:#if players y value is less than set it to zero
                playerY = 0
            if playerY >540:#if players y value is greater than 540 set it to 540 
                playerY = 540



            playerX = playerX+playerXChange
            playerY = playerY+playerYChange#makes the character x and y change by the value set in the code above
            gameDisplay.blit(dojoBackDrop,(0,0))
            for i in range(8):#loops to get 8 food on the screen at once
                food =FoodItems(5,5,5)#instatiates an object 
                allSprites.add(food)#adds object to sprite group 



            #instantiate a new object
            allSprites.update()#updates all sprites 
            allSprites.draw(gameDisplay)#draws all the sprites on the screen                                     
            gameDisplay.blit(character,(playerX,playerY))
            pygame.display.update()



    menuScreen()

我希望图像显示在屏幕上并保持移动,但我无法克服此错误。

1 个答案:

答案 0 :(得分:1)

如果要向pygame.sprite.Group发送对象,则必须从pygame.sprite.Sprite派生该对象的类:

class FoodItems(pygame.sprite.Sprite):
    def __init__(self,weightIncrease,xChange,yChange): 
        pygame.sprite.Sprite.__init__(self)

        # [...]

此外,方法.update()中缺少“自我”属性:

class FoodItems(pygame.sprite.Sprite):

    # [...]

    def update(self): #conitnusly updates the sprite on the screen 

        self.rectX += self.xChange
        self.rectY += self.yChange #keeps moving the objects
        if self.rect.x > displayHeight +10:
            self.rect.x = random.randrange(displayWidth-self.rect.width)
            self.rect.y = random.randrange(displayHeight-self.rect.height)
                                    #this will make the object be able to move