Python 带冲突的Pygame模块错误

Python 带冲突的Pygame模块错误,python,python-3.x,pygame,Python,Python 3.x,Pygame,我一直在做shmup游戏有一段时间了。我经常遇到的问题之一是碰撞。问题是,我的代码看起来完全正确,但我从pygame模块本身得到了错误 例如: Traceback (most recent call last): File "/home/pi/shooter_modified(1).py", line 101, in <module> hitregistry = pygame.sprite.groupcollide(enemies, player, True, True) Fil

我一直在做shmup游戏有一段时间了。我经常遇到的问题之一是碰撞。问题是,我的代码看起来完全正确,但我从pygame模块本身得到了错误

例如:

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'
回溯(最近一次呼叫最后一次):
文件“/home/pi/shooter_modified(1.py)”,第101行,在
hitregistry=pygame.sprite.groupcollide(敌人,玩家,真,真)
文件“/usr/lib/python3/dist packages/pygame/sprite.py”,第1549行,在groupcollide中
对于groupa.sprites()中的s:
AttributeError:“列表”对象没有属性“精灵”
这是我自己的代码的问题还是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!")
导入pygame,随机,操作系统
从pygame.locals导入*
“初始化pygame”
pygame.init()
“设置变量”
红色=(255,0,0)
绿色=(0255,0)
蓝色=(0,0255)
黑色=(0,0,0)
白色=(255255)
宽度=1280
高度=720
“创建窗口”
screen=pygame.display.set_模式((1280720))
clock=pygame.time.clock()
“精灵团体”
all_sprites=pygame.sprite.Group()
子弹=pygame.sprite.Group()
敌人=pygame.sprite.Group()
pygame.display.set_标题(“神风基地防御”)
“班级”
职业玩家(pygame.sprite.sprite):
定义初始化(自):
self.x,self.y=pygame.mouse.get_pos()
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
#self.image=pygame.Surface((32,32))++--3
#$self.image.fill((绿色))
self.image=pygame.image.load(“vehicle.png”)
self.image.set_颜色键(白色)
self.rect=self.image.get_rect()
self.rect.center=(宽度/2700)
自身速度=0
def更新(自我):
self.keypress=pygame.key.get_pressed()
如果self.keypress[pygame.K_a]:
自身速度=3
self.rect.x-=自速度
如果self.keypress[pygame.K_d]:
自身速度=3
self.rect.x+=自速度
#self.rect.x+=1
如果self.rect.left>宽度:
self.rect.right=0
如果self.rect.right<0:
self.rect.left=1280
def喷射(自):
bullet=bullet(self.rect.centerx、self.rect.top)
所有精灵。添加(项目符号)
职业敌人(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.image.load(“导弹.png”)
self.rect=self.image.get_rect()
self.rect.x=random.randrange(50,宽度)
self.rect.y=random.randrange(-100,-40)
self.speedy=random.randrange(1,5)
self.speedx=random.randrange(0,3)
def更新(自我):
self.rect.y=self.rect.y+self
self.rect.x=self.rect.x+self.speedx
如果self.rect.top>高度:
self.rect.x=random.randrange(50,宽度)
self.rect.y=random.randrange(-200,-100)
self.speedy=random.randrange(1,6)
类子弹(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.image=pygame.Surface((5,10))
self.image.fill(红色)
self.rect=self.image.get_rect()
self.speedy=-5
def更新(自我):
自校正y-=5
如果self.rect.bottom<0:
self.kill()
敌人=[]
player=player()
enemy1=敌人()
敌人2=敌人()
敌人3=敌人()
敌人4=敌人()
所有精灵。添加(enemy1)
所有精灵。添加(enemy2)
所有精灵。添加(enemy3)
所有精灵。添加(enemy4)
敌人。追加(enemy1)
敌人。附加(enemy2)
敌人。附加(enemy3)
敌人。附加(enemy4)
pygame.init()
尽管如此:
pygame.event.pump()
“主回路”
所有精灵。添加(玩家)
屏幕填充(黑色)
所有精灵。绘制(屏幕)
hitregistry=pygame.sprite.groupcollide(敌人,玩家,真,真)
如有需要:
打印(“点击!”)
pygame.quit()
对于pygame.event.get()中的事件:
如果event.type==pygame.MOUSEBUTTONDOWN:
bullet=bullet()
bullet.rect.x=player.rect.x+50
bullet.rect.y=player.rect.y
所有精灵。添加(项目符号)
项目符号。添加(项目符号)
项目符号。绘制(屏幕)
bullethits=pygame.sprite.groupcollide(敌人,子弹,真,真)
如果子弹击中:
打印(“点击!”)

pygame.sprite.groupcollide
前两个参数的类型为
pygame.sprite.Group
,但您给它一个
列表和一个
播放器


因此,您应该尝试使用
敌人=组()
敌人。添加(enemy1)
,而不是
敌人=[]
敌人。添加(enemy1)
。可能需要进行其他更改。对球员来说也是如此。尝试查看。您的错误发生在以下位置:

hitregistry=pygame.sprite.groupcollide(敌人,玩家,真,真)

groupcollide()
需要两个精灵组作为参数。当你在做
敌人
子弹
的对比时,你正确地使用了它,但是在这里你传递了它
敌人
(一组)和
玩家
(非一组)。您可能想改用
spritecollide()
来测试精灵和组:

hitregistry=pygame.sprite.spritecollide(玩家,敌人,真)


另外,为什么在
while
循环中添加(player)
?您将在每帧向组中添加播放机…

欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南。适用于这里。在您发布MCVE代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并重现您描述的问题。我猜是新手错误。谢谢你的回答,这很有帮助。