#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 Спасибо тебе. Пожалуйста.