2017-03-26 1 views
2

Chaque fois que je lance mon code, je continue à recevoir une erreur et je n'arrive pas à comprendre pourquoi. J'ai aussi un peu de script qui fait exactement le même travail mais avec des sprites différents. J'essaie de détecter une collision entre «porte» et «joueur». Ceci est l'erreur:Pygame - Erreur lors de la détection d'une collision dans un groupe

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'

Voici mon 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

Vous devez inclure l'erreur que vous obtenez. Les messages d'erreur sont en fait très utiles et vous en disent beaucoup sur ce qui ne va pas. – Chris

+0

J'ai ajouté l'erreur pour vous! :-) –

+0

Je pense que vous devriez aussi poster votre code sur http://codereview.stackexchange.com/ mais assurez-vous qu'il fonctionne en premier. – skrx

Répondre

4

Vous passer les arguments à pygame.sprite.spritecollide dans le mauvais ordre dans cette ligne:

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

devrait être :

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

Le premier argument doit être un pygame.sprite.Sprite et le second argument un pygame.sprite.Group.

+0

Parfait! Corrigé à merveille, merci! –