我正在尝试使用PyGame在Python中制作游戏,但我收到了这个追溯:
Traceback (most recent call last):
File "C:\Users\usuario\Documents\abscorp\232\232.py", line 150, in
<module>
hits = pygame.sprite.groupcollide(drop, player, True, True)
File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1536, in
groupcollide
c = SC(s, groupb, dokillb, collided)
File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1500, in
spritecollide
for s in group.sprites():
AttributeError: 'Player' object has no attribute 'sprites'
有一些水滴应该从管道中掉落,但IDLE不断给我一个错误信息。我相信产生错误的部分如下:“pygame.sprite.groupcollide”。
完整的代码附在下面。
import pygame
import time
import sys
import random
WIDTH = 800
HEIGHT = 600
FPS = 360
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GRAY = (168, 169, 173)
font_name = pygame.font.match_font('arial')
pygame.init()
pygame.mixer.init()
screen=pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("where is the drop!")
clock = pygame.time.Clock()
#Load all game graphics and sounds
background = pygame.image.load("bckgrnd_3.png").convert()
background_rect = background.get_rect()
boy_1_img = pygame.image.load("boy_1_img.png").convert()
drop_img = pygame.image.load("drop_img.png").convert()
explosion_anim = {}
explosion_anim['lg'] = []
explosion_anim['sm'] = []
for i in range(3):
filename = 'exp_{}.png'.format(i)
img = pygame.image.load(filename).convert()
img.set_colorkey(GRAY)
img_lg = pygame.transform.scale(img, (75, 75))
explosion_anim['lg'].append(img_lg)
img_sm = pygame.transform.scale(img, (32, 32))
explosion_anim['sm'].append(img_sm)
def newdrop():
d = Drop()
all_sprites.add(d)
drop.add(d)
class Drop(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.transform.scale(drop_img, (50, 38))
self.image.set_colorkey(BLACK)
self.rect = self.image.get_rect()
self.radius = int(self.rect.width * .85/ 2)
#pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 2)
self.speedx = random.randrange(-1, 1)
def update(self):
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.top > HEIGHT + 10:
self.rect.x = random.randrange(WIDTH - self.rect.width)
self.rect.y = random.randrange(-100, -40)
self.speedy = random.randrange(1, 2)
class Player(pygame.sprite.Sprite):
#sprite for the Player
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.transform.scale(boy_1_img, (50, 38))
self.image.set_colorkey(WHITE)
self.rect = self.image.get_rect()
self.radius = 25
#pygame.draw.circle(self.image, RED, self.rect.center, self.radius)
self.rect.center = (WIDTH / 1.5, HEIGHT / 1.5)
self.shield = 100
self.shoot_delay = 250
self.last_shot = pygame.time.get_ticks()
def update(self):
self.speedx = 0
self.speedy = 0
keystate = pygame.key.get_pressed()
if keystate[pygame.K_LEFT]:
self.speedx = -2
if keystate[pygame.K_RIGHT]:
self.speedx = 2
if keystate[pygame.K_UP]:
self.speedy = -2
if keystate[pygame.K_DOWN]:
self.speedy = 2
if keystate[pygame.K_SPACE]:
self.throw()
self.rect.x += self.speedx
self.rect.y += self.speedy
if self.rect.right > WIDTH:
self.rect.right = WIDTH
if self.rect.left < 0:
self.rect.left = 0
if self.rect.top > HEIGHT:
self.rect.top = HEIGHT
if self.rect.bottom < 0:
self.rect.bottom = 0
all_sprites = pygame.sprite.Group()
drop = pygame.sprite.Group()
player=Player()
all_sprites.add(player)
for i in range(8):
newdrop()
##pygame.mixer.music.play(loops=-1)
# Game Loop
score = 0
running= True
while running:
#keep loop running at the right speed
#Process input (events)
for event in pygame.event.get():
#check for closing window
if event.type == pygame.QUIT:
running= False
#Update
all_sprites.update()
#check to see if a drop hits bucket
hits = pygame.sprite.groupcollide(drop, player, True, True)
for hit in hits:
score += 1
##random.choice(expl_sounds).play()
expl = Explosion(hit.rect.center, 'lg')
all_sprites.add(expl)
newdrop()
#check to see if a drop hits big bucket
hits = pygame.sprite.spritecollide(bucket, drop, True,
pygame.sprite.collide_circle)
for hit in hits:
newdrop()
player.shield -= 10
expl = Explosion(hit.rect.center, 'sm')
all_sprites.add(expl)
if player.shield <= 0:
running = False
#print (player.shield)
#Draw / render
screen.fill(BLACK)
screen.blit(background, (0, 0))
all_sprites.draw(screen)
draw_text(screen, str(score), 18, WIDTH / 2, 10)
draw_shield_bar(screen, 5, 5, player.shield)
#*after* drawing everything, flip the display
pygame.display.flip()
pygame.quit()
答案 0 :(得分:3)
错误消息显示groupcollide
存在问题,请在documentation 中查看。
groupcollide(group1,group2,dokill1,dokill2,collided = None) - &gt; Sprite_dict
查找两组之间发生碰撞的所有精灵。
文档显示它需要两个组 - 这意味着pygame.sprite.Group
但是您使用的player
是pygame.sprite.Sprite
检查Sprite
和Group
之间的碰撞