Прямое столкновение Python Pygame не обнаружено между двумя спрайтами

#python #pygame

Вопрос:

Я создаю игру, и в настоящее время я застрял, пытаясь заставить игрока «столкнуться» с «монетой». Я изменил весь свой код, чтобы сделать их спрайтами с классами, но в нем говорится, что у одного из классов «нет прямого атрибута», вот код плеера и код столкновения (извините за форматирование, я занимался этим весь день).:

 class Player(pygame.sprite.Sprite):  def __init__(self):  pygame.sprite.Sprite.__init__(self)  self.image = pygame.Surface ((40, 40))  self.image.fill(WHITE)  self.rect = self.image.get_rect()  self.rect.center = (425), (400)  self.movex = 0 # move along X  self.movey = 0 # move along Y  self.frame = 0 # count frames   def control(self, x, y): # player movement  self.movex  = x  self.movey  = y   def update(self):  self.rect.x = self.rect.x   self.movex # updating the position  self.rect.y = self.rect.y   self.movey   class Coin(pygame.sprite.Sprite):  def __init__(self):  pygame.sprite.Sprite.__init__(self)  self.image = pygame.Surface ((40, 40))  self.image.fill(YELLOW)  self.rect = self.image.get_rect()  self.rect.center = (random.randint(20, 780)), (random.randint(20, 230))   def check_collision(self, Coin, Player):  if pygame.sprite.collide_rect(Coin, Player):  print("collide")  

И это основной функциональный цикл:

 def main():  score_check = 0  clock = pygame.time.Clock()  run = True   coin = Coin()  PLAYER = Player()   all_sprites = pygame.sprite.Group()  all_sprites.add(coin, PLAYER)   # drawing the layers of sprites  def draw_window():  WIN.fill(BLACK) # background colour  # score drawn  global score_check  score_print = SCORE_FONT.render("Score: "   str(score_check), 1, WHITE)  WIN.blit(score_print, (30, 30))   # displaying the images  all_sprites.update()  all_sprites.draw(WIN)  pygame.display.update()   while run:  # game speed  clock.tick(FPS)  # draw window  draw_window()   for event in pygame.event.get():  # checking quit function is pressed  if event.type == pygame.QUIT:  run = False  pygame.quit()  exit()   coin.check_collision(Coin, Player)  

Ответ №1:

Вы должны передать объект игрока в check_collision :

Удалите Coin аргумент:

 class Coin(pygame.sprite.Sprite):  # [...]   def check_collision(self, player):  if pygame.sprite.collide_rect(self, player):  print("collide")  

Вызов check_collision в цикле приложения вместо цикла событий:

 while run:  # game speed  clock.tick(FPS)  # draw window  draw_window()   for event in pygame.event.get():  # checking quit function is pressed  if event.type == pygame.QUIT:  run = False  pygame.quit()  exit()   # INDENTATION  #lt;--|  coin.check_collision(PLAYER)  

Комментарии:

1. Просто попробовал это пару раз, и я получаю эту ошибку «Ошибка атрибута: модуль ‘pygame.sprite’ не имеет атрибута ‘sprite'» 🙁

2. @RachelAmbrose Код отлично работает для меня. Я это проверил. Вы скопировали весь код из моего ответа?

3. Я написал игрок в нижнем регистре вместо монеты.check_collision(ИГРОК)! Не могу поверить, что я пропустил это, ха-ха, спасибо, я ломал голову.

4. Спасибо, сделаю (я новенькая)

5. @RachelAmbrose Спасибо тебе. Пожалуйста.