2017-08-02 59 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

我猜想有新手错误。谢谢你的答案,它帮助了很多。 –