如何解决电脑游戏错误是水上游戏?

问题描述 投票:-4回答:1

我正在尝试使用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()
python-2.7 pygame 2d-games
1个回答
3
投票

错误消息显示它与groupcollide有问题所以在documentation 中检查它。

groupcollide(group1,group2,dokill1,dokill2,collided = None) - > Sprite_dict

找到在两组之间发生碰撞的所有精灵。

文档显示它需要两组 - 这意味着pygame.sprite.Group 但你使用的playerpygame.sprite.Sprite

检查SpriteGroup之间的碰撞

© www.soinside.com 2019 - 2024. All rights reserved.