2017-03-26 2 views
2

Jedes Mal, wenn ich meinen Code ausführe, erhalte ich immer einen Fehler, und ich kann nicht herausfinden, warum. Ich habe auch ein bisschen Skript, das genau den gleichen Job erledigt, aber mit verschiedenen Sprites. Ich versuche eine Kollision zwischen "Tür" und "Spieler" zu erkennen. Dies ist der Fehler:Pygame - Fehler beim Erkennen einer Kollision in einer Gruppe

Traceback (most recent call last): File "C:\Blood_Red\Pokemon_Blood_Red.py", line 225, in door_enter = pygame.sprite.spritecollide(door_group, player, False) File "C:\Users\Cameron\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pygame\sprite.py", line 1524, in spritecollide spritecollide = sprite.rect.colliderect AttributeError: 'Group' object has no attribute 'rect'

Hier ist mein Code:

import pygame 

from pygame.locals import* 

#initialise pygame 
pygame.init() 

WHITE = (255,255,255) 

#counts which sprite you should be on when running 

#create screen 
screen_width = 160 
screen_height = 144 
screen_multiplier = 4 
screen = pygame.display.set_mode(((screen_width*screen_multiplier),(screen_height*screen_multiplier))) 
pygame.display.set_caption('Pokemon Blood Red') 

#Sprite stuff 
sprite = pygame.image.load('player_east_still.png') 
#Reform the sprite 
sprite = pygame.transform.scale(sprite, (10*screen_multiplier, 14*screen_multiplier)) 
sprite.set_colorkey(WHITE) 

class Player(pygame.sprite.Sprite): 

    def __init__(self): 
     super(Player, self).__init__() 
     self.player_sprite = pygame.Surface((10*screen_multiplier, 14*screen_multiplier)) 
     self.player_sprite.fill(WHITE) 
     self.rect = self.player_sprite.get_rect() 
     self.rect.x = 160/2 
     self.rect.y = 144/2 

class Blocks(pygame.sprite.Sprite): 

    def __init__(self, width, height): 
     super(Blocks, self).__init__() 
     block_width = width 
     self.image = pygame.Surface([width, height]) 
     self.image.fill(WHITE) 
     self.rect = self.image.get_rect() 
     self.block_width = width 
     self.block_height = height 
#######################################################################   
player = Player() 
nt_trees_left = Blocks(15*screen_multiplier, 144*screen_multiplier) 
nt_trees_left.rect.x = 0*screen_multiplier 
nt_trees_left.rect.y = 0*screen_multiplier 
screen.blit(nt_trees_left.image, (nt_trees_left.rect.x, nt_trees_left.rect.y)) 

nt_trees_top = Blocks(160*screen_multiplier, 14*screen_multiplier) 
nt_trees_top.rect.x = 33*screen_multiplier 
nt_trees_top.rect.y = 0*screen_multiplier 
screen.blit(nt_trees_top.image, (nt_trees_top.rect.x, nt_trees_top.rect.y)) 

laboratory = Blocks(50*screen_multiplier, 46*screen_multiplier) 
laboratory.rect.x = 98*screen_multiplier 
laboratory.rect.y = 0*screen_multiplier 
screen.blit(laboratory.image, (laboratory.rect.x, laboratory.rect.y)) 

nt_trees_right = Blocks(15*screen_multiplier, 72*screen_multiplier) 
nt_trees_right.rect.x = 148*screen_multiplier 
nt_trees_right.rect.y = 0*screen_multiplier 
screen.blit(nt_trees_right.image, (nt_trees_right.rect.x, nt_trees_right.rect.y)) 

nt_trees_right_bottom = Blocks(15*screen_multiplier, 65*screen_multiplier) 
nt_trees_right_bottom.rect.x = 148*screen_multiplier 
nt_trees_right_bottom.rect.y = 91*screen_multiplier 
screen.blit(nt_trees_right_bottom.image, (nt_trees_right_bottom.rect.x, nt_trees_right_bottom.rect.y)) 

nt_trees_bottom = Blocks(160*screen_multiplier, 14*screen_multiplier) 
nt_trees_bottom.rect.x = 0*screen_multiplier 
nt_trees_bottom.rect.y = 128*screen_multiplier 
screen.blit(nt_trees_bottom.image, (nt_trees_bottom.rect.x, nt_trees_bottom.rect.y)) 

nt_player_house = Blocks(20*screen_multiplier, 22*screen_multiplier) 
nt_player_house.rect.x = 38*screen_multiplier 
nt_player_house.rect.y = 53*screen_multiplier 
screen.blit(nt_player_house.image, (nt_player_house.rect.x, nt_player_house.rect.y)) 

nt_friend_house = Blocks(20*screen_multiplier, 22*screen_multiplier) 
nt_friend_house.rect.x = 70*screen_multiplier 
nt_friend_house.rect.y = 53*screen_multiplier 
screen.blit(nt_friend_house.image, (nt_friend_house.rect.x, nt_friend_house.rect.y)) 

################################################################################ 
class Doors(pygame.sprite.Sprite): 

    def __init__(self): 
     super(Doors, self).__init__() 
     self.player_house_door = pygame.Surface((10*screen_multiplier, 14*screen_multiplier)) 
     self.player_house_door.fill(WHITE) 
     self.rect = self.player_house_door.get_rect() 
     self.rect.x = 160/2 
     self.rect.y = 144/2 

player_house_door = Doors() 
door_group = pygame.sprite.Group() 
door_group.add(player_house_door) 
################################################################################ 
blockades = pygame.sprite.Group() 
blockades.add(nt_trees_left) 
blockades.add(nt_trees_top) 
blockades.add(nt_trees_right) 
blockades.add(nt_trees_right_bottom) 
blockades.add(laboratory) 
blockades.add(nt_trees_bottom) 
blockades.add(nt_player_house) 
blockades.add(nt_friend_house) 

place = 1 
def area_load(): 
    global background 
    if place == 1: 
     background = pygame.image.load('neuory_town.png').convert() 
     background = pygame.transform.scale(background, (160*screen_multiplier, 144*screen_multiplier)) 
     screen.blit(background, (0, 0)) 
     blockades.add(nt_trees_left) 
area_load() 





####################################################################### 


#Random variables for later use 

pygame.init() 

amount_caught = 0 
place = 1 
catch1 = {'pokemon':'none', 
      'hp':0, 
      'attack':0, 
      'defence':0, 
      'sp_attack':0, 
      'sp_defence':0,} 

(x) = 160*0.45 
(y) = 144*0.45 
def caught(): 
    if amount_caught == 0: 
     pass 
     #catch1 values are equal to wild one's 

#Mainloop 
crashed = False 
while not crashed: 

    x_change = 0 
    y_change = 0 

    #Different buttons 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      crashed = True 
      pygame.quit() 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       x_change = -3*screen_multiplier 
       player.rect.x += x_change 
       screen.blit(player.player_sprite, (player.rect.x, player.rect.y)) 
       hits = pygame.sprite.spritecollide(player, blockades, False)    
       if hits: 
        while hits: 
         print ('Collision!') 
         x_change = 1*screen_multiplier 
         player.rect.x += x_change 
         hits = pygame.sprite.spritecollide(player, blockades, False) 
       sprite = pygame.image.load('player_west_still.png') 
      elif event.key == pygame.K_RIGHT: 
       x_change = 3*screen_multiplier 
       player.rect.x += x_change 
       screen.blit(player.player_sprite, (player.rect.x, player.rect.y)) 
       hits = pygame.sprite.spritecollide(player, blockades, False)    
       if hits: 
        while hits: 
         print ('Collision!') 
         x_change = -1*screen_multiplier 
         player.rect.x += x_change 
         hits = pygame.sprite.spritecollide(player, blockades, False) 
       sprite = pygame.image.load('player_east_still.png') 
      elif event.key == pygame.K_UP:  
       y_change = -3*screen_multiplier 
       player.rect.y += y_change 
       screen.blit(player.player_sprite, (player.rect.x, player.rect.y)) 
       hits = pygame.sprite.spritecollide(player, blockades, False)    
       if hits: 
        while hits: 
         print ('Collision!') 
         y_change = 1*screen_multiplier 
         player.rect.y += y_change 
         hits = pygame.sprite.spritecollide(player, blockades, False) 
       sprite = pygame.image.load('player_north_still.png') 
      elif event.key == pygame.K_DOWN: 
       y_change = 3*screen_multiplier 
       player.rect.y += y_change 
       screen.blit(player.player_sprite, (player.rect.x, player.rect.y)) 
       hits = pygame.sprite.spritecollide(player, blockades, False)    
       if hits: 
        while hits: 
         print ('Collision!') 
         y_change = -1*screen_multiplier 
         player.rect.y += y_change 
         hits = pygame.sprite.spritecollide(player, blockades, False) 
       sprite = pygame.image.load('player_south_still.png') 
     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       x_change = 0 
      elif event.key == pygame.K_RIGHT: 
       x_change = 0 
      elif event.key == pygame.K_UP: 
       y_change = 0 
      elif event.key == pygame.K_DOWN: 
       y_change = 0  
    x += x_change 
    y += y_change 
    player.rect.x += x_change 
    player.rect.y += y_change 

    #Check for collisions 
    hits = pygame.sprite.spritecollide(player, blockades, False) 
    door_enter = pygame.sprite.spritecollide(door_group, player, False) 
    if door_enter: 
     print ('yaaas') 
    #Draw everything 
    screen.blit(player.player_sprite, (player.rect.x, player.rect.y)) 
    screen.blit(background, (0, 0)) 
    sprite = pygame.transform.scale(sprite, (10*screen_multiplier, 14*screen_multiplier)) 
    sprite.set_colorkey(WHITE) 
    screen.blit(sprite,(player.rect.x,player.rect.y)) 
    screen.blit(player_house_door.player_house_door, (player_house_door.rect.x, player_house_door.rect.y)) 

    pygame.display.flip() 
pygame.quit()  
+1

Sie sollten den Fehler enthalten, den Sie erhalten. Fehlermeldungen sind tatsächlich sehr nützlich und erzählen Ihnen viel über das, was falsch ist. – Chris

+0

Ich habe den Fehler für Sie hinzugefügt! :-) –

+0

Ich denke, Sie sollten Ihren Code auch auf http://codereview.stackexchange.com/ veröffentlichen, aber stellen Sie sicher, dass es zuerst funktioniert. – skrx

Antwort

4

Sie vorbei, die Argumente zu pygame.sprite.spritecollide in der falschen Reihenfolge in dieser Zeile:

door_enter = pygame.sprite.spritecollide(door_group, player, False) 

sollte :

door_enter = pygame.sprite.spritecollide(player, door_group, False) 

Der erste Arg muss ein pygame.sprite.Sprite sein und der zweite Arg ein pygame.sprite.Group.

+0

Perfekt! Fand es wunderbar, danke! –