gpt4 book ai didi

python - 尝试在 pygame 的 for 循环中创建对象并得到 AttributeError : 'FoodItems' object has no attribute 'add_internal'

转载 作者:行者123 更新时间:2023-12-01 00:46:23 27 4
gpt4 key购买 nike

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

Traceback (most recent call last): File "N:/Y12/Computer science/Consumo/Consumo V8.5.py", line 172, in menuScreen() File "N:/Y12/Computer science/Consumo/Consumo V8.5.py", line 113, in menuScreen button("Play Game",850,340,120,50,blue,gameLoop)#Puts theree button on the screen File "N:/Y12/Computer science/Consumo/Consumo V8.5.py", line 99, in button action() File "N:/Y12/Computer science/Consumo/Consumo V8.5.py", line 160, in gameLoop allSprites.add(food) File "C:\Python33\lib\site-packages\pygame\sprite.py", line 378, in add sprite.add_internal(self) AttributeError: 'FoodItems' object has no attribute '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()

我希望图像显示在屏幕上并继续移动,但我就是无法克服这个错误。

最佳答案

如果你想和一个对象到 pygame.sprite.Group ,那么该对象的类必须派生自 pygame.sprite.Sprite :

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

# [...]

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

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

关于python - 尝试在 pygame 的 for 循环中创建对象并得到 AttributeError : 'FoodItems' object has no attribute 'add_internal' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948388/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com