基本上我正在尝试编写一些在屏幕上显示食物的代码,并使用类结构创建这些对象。然后将它们放在一个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()
我希望图像显示在屏幕上并保持移动,但我无法克服此错误。
答案 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