2017-08-02 58 views
-1

我一直在研究shmup遊戲很長一段時間。我經常遇到的其中一個問題是碰撞。事情是,我的代碼似乎是完全正確的,但我從pygame模塊本身得到錯誤!Pygame模塊錯誤與collsions

例子:

Traceback (most recent call last): 
File "/home/pi/shooter_modified(1).py", line 101, in <module> 
    hitregistry = pygame.sprite.groupcollide(enemies, player, True, True) 
File "/usr/lib/python3/dist-packages/pygame/sprite.py", line 1549, in groupcollide 
    for s in groupa.sprites(): 
AttributeError: 'list' object has no attribute 'sprites' 

這是某種形式的問題,與我自己的代碼或與問題與pygame的模塊本身? 這裏是我的代碼:

import pygame,random,os 
from pygame.locals import * 
'initialize pygame' 
pygame.init() 
'set variables' 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
black = (0,0,0) 
white = (255,255,255) 
width = 1280 
height = 720 
'create window' 
screen = pygame.display.set_mode((1280,720)) 
clock = pygame.time.Clock() 
'sprite groups' 
all_sprites = pygame.sprite.Group() 
bullets = pygame.sprite.Group() 
enemies = pygame.sprite.Group() 
pygame.display.set_caption("kamikaze base defense") 
'classes' 

class Player(pygame.sprite.Sprite): 
    def __init__(self): 
     self.x, self.y = pygame.mouse.get_pos() 
     pygame.sprite.Sprite.__init__(self) 
     #self.image = pygame.Surface((32,32))++--3 
     #$self.image.fill((green)) 
     self.image = pygame.image.load("vehicle.png") 
     self.image.set_colorkey(white) 
     self.rect = self.image.get_rect() 
     self.rect.center = (width/2,700) 
     self.speed = 0 
    def update(self): 
     self.keypress = pygame.key.get_pressed() 
     if self.keypress[pygame.K_a]: 
      self.speed = 3 
      self.rect.x -= self.speed 
     if self.keypress[pygame.K_d]: 
      self.speed = 3 
      self.rect.x += self.speed 

     #self.rect.x += 1 
     if self.rect.left > width: 
      self.rect.right = 0 
     if self.rect.right < 0: 
      self.rect.left = 1280 
    def shoot(self): 
     bullet = Bullet(self.rect.centerx,self.rect.top) 
     all_sprites.add(bullet) 
class Enemy(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("missile.png") 
     self.rect = self.image.get_rect() 
     self.rect.x = random.randrange(50,width) 
     self.rect.y = random.randrange(-100,-40) 
     self.speedy = random.randrange(1,5) 
     self.speedx = random.randrange(0,3) 
    def update(self): 
     self.rect.y = self.rect.y + self.speedy 
     self.rect.x = self.rect.x + self.speedx 
     if self.rect.top > height: 
      self.rect.x = random.randrange(50,width) 
      self.rect.y = random.randrange(-200,-100) 
      self.speedy = random.randrange(1,6)    
class Bullet(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((5,10)) 
     self.image.fill(red) 
     self.rect = self.image.get_rect() 
     self.speedy = -5 
    def update(self): 
     self.rect.y -= 5 
     if self.rect.bottom < 0: 
      self.kill() 


enemies = [] 
player = Player() 
enemy1 = Enemy() 
enemy2 = Enemy() 
enemy3 = Enemy() 
enemy4 = Enemy() 
all_sprites.add(enemy1) 
all_sprites.add(enemy2) 
all_sprites.add(enemy3) 
all_sprites.add(enemy4) 
enemies.append(enemy1) 
enemies.append(enemy2) 
enemies.append(enemy3) 
enemies.append(enemy4) 
pygame.init() 
while True: 
    pygame.event.pump() 
    'main loop' 
    all_sprites.add(player) 
    screen.fill(black) 
    all_sprites.draw(screen) 
    hitregistry = pygame.sprite.groupcollide(enemies, player, True, True) 
    if hitregistry: 
     print("hit!") 
     pygame.quit() 
    for event in pygame.event.get(): 
     if event.type == pygame.MOUSEBUTTONDOWN: 
      bullet = Bullet() 
      bullet.rect.x = player.rect.x +50 
      bullet.rect.y = player.rect.y 
      all_sprites.add(bullet) 
      bullets.add(bullet) 
    bullets.draw(screen) 
    bullethits = pygame.sprite.groupcollide(enemies,bullets,True,True) 
    if bullethits: 
     print("hit!") 
+1

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。在發佈您的MCVE代碼並準確描述問題之前,我們無法爲您提供有效的幫助。 我們應該能夠將發佈的代碼粘貼到文本文件中,並重現您描述的問題。 – Prune

回答

1

pygame.sprite.groupcollide前兩個參數是pygame.sprite.Group型的,但你給它一個listPlayer

因此,而不是enemies = []enemies.append(enemy1),你應該嘗試enemies = Group()enemies.add(enemy1)。其他更改可能是必要的。對於玩家也是如此。試着看看pygame documentation

4

你的錯誤是發生在這裏:

hitregistry = pygame.sprite.groupcollide(enemies, player, True, True)

groupcollide()需要兩個雪碧組作爲參數。當你在使用enemiesbullets時,你正確地使用它,但在這裏你通過enemies(一個組)和player(不是一個組)。你可能想使用spritecollide()代替,測試雪碧與一組:

hitregistry = pygame.sprite.spritecollide(player, enemies, True)

另外,爲什麼你有你的all_sprites.add(player)循環while裏面?您正在將播放器添加到組中的每一幀...

+0

我猜想有新手錯誤。謝謝你的答案,它幫助了很多。 –