2017-12-20 13 views
-4

私はpygameのダウンロードを使用してPythonでゲームを作るしようとしているが、私は、このトレースバックを受け取る:どのようにPCゲームのエラーを解決するには水ゲームですか?

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() 
+3

私には叫ばないでください。 :P – cHao

+2

ショーを止めてください。 ALL CAPSのテキストは読みにくく、理解するのが難しく、非常に面倒です。コードに小文字のテキストがあるので、Shiftキーがはっきりと機能します。これらのShiftキーはキーボードの両面に配置されているため、テキストを読みやすくするために使用することができます。今すぐ使用してください。投稿を編集して、正しく質問してください。編集中は、表示されているエラーメッセージを含めることができ、その情報も利用できるようになります。 **あなたの問題を解決するために**無料のヘルプ**を求めています**。詳細を提供し、丁寧に尋ねる。 –

+0

これが何かに影響するかどうかはわかりませんが、Playerクラスのインデントを解除する必要があります。上に示したように、PythonはDrop()に含まれるPlayer()を読み込んでいます。 –

答えて

3

エラーメッセージは、それがそうdocumentationでそれをチェックgroupcollideに問題があることを示しています。

groupcollide(グループ1、グループ2、dokill1、dokill2は、=なし衝突していない) - > Sprite_dict

は、両群間で衝突するすべてのスプライトを探します。

ドキュメントは、それが2つのグループを必要とすることを示している - それはpygame.sprite.Group
を意味していますが、あなたが

関連する問題