2017-08-02 3 views
-1

Ich arbeite seit einiger Zeit an einem Shmup-Spiel. Eines der Probleme, die ich ständig bekomme, sind Kollisionen. Die Sache ist, scheint mein Code völlig korrekt zu sein, aber ich bekomme Fehler von der Pygame-Modul selbst!Fehler im Pygame-Modul mit Kollisionen

Beispiel:

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' 

Ist das eine Art von Problem mit meinem eigenen Code oder und Ausgabe mit dem pygame Modul selbst? Hier ist mein Code:

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

Willkommen bei StackOverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. Wir sollten in der Lage sein, Ihren gesendeten Code in eine Textdatei einzufügen und das beschriebene Problem zu reproduzieren. – Prune

Antwort

1

pygame.sprite.groupcollide ersten beiden Argumente des Typs sind pygame.sprite.Group, aber du bist es eine list und Player geben.

Also, anstelle von enemies = [] und enemies.append(enemy1), sollten Sie versuchen, enemies = Group() und enemies.add(enemy1). Andere Änderungen können notwendig sein. Ähnlich für den Spieler. Versuchen Sie, in die pygame documentation zu schauen.

4

Ihr Fehler geschieht hier:

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

groupcollide() erfordert zwei Sprite-Gruppen als Argumente. Sie verwenden es korrekt, wenn Sie enemies gegenüber bullets tun, aber hier übergeben Sie es enemies (eine Gruppe) und player (keine Gruppe). Sie wollen wahrscheinlich spritecollide() stattdessen verwenden, die einen Sprit im Vergleich zu einer Gruppe testen:

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

Auch, warum haben Sie all_sprites.add(player) in Ihrer while Schleife? Sie fügen den Player der Gruppe jeden Frame hinzu ...

+0

Anfänger Fehler, denke ich. Danke für die Antwort, es hat sehr geholfen. –