簡體   English   中英

Pygame模塊錯誤與合謀

[英]Pygame module errors with collsions

我一直在做一個大型游戲。 我經常遇到的問題之一就是碰撞。 問題是,我的代碼似乎是完全正確的,但是我從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'

這是我自己的代碼出現問題還是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!")

您的錯誤在這里發生:

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

groupcollide()需要兩個Sprite組作為參數。 當您對enemiesbullets進行enemies時,您可以正確使用它,但是在這里,您可以將enemies (一個組)和一個player (而不是一個組)傳遞給它。 您可能想改用spritecollide()來測試Sprite和Group:

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

另外,為什么在while循環中有all_sprites.add(player) 您正在每幀將播放器添加到組中...

pygame.sprite.groupcollide前兩個參數的類型為pygame.sprite.Group ,但是您要為其提供一個list和一個Player

因此,您應該嘗試使enemies = Group()enemies = Group() enemies.append(enemy1)而不是enemies = []enemies = Group() enemies.add(enemy1) 可能需要其他更改。 玩家也一樣。 嘗試查看pygame文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM