Почему pygame set_timer () не работает в моем коде? - PullRequest
2 голосов
/ 09 октября 2019

Во время программирования игры я столкнулся с проблемой с функцией set_timer. В моем коде я хотел, чтобы бар отображал текущее количество еды, которое у меня есть, которое должно уменьшаться каждую секунду. Тем не менее, похоже, что количество свободного места в моем баре не увеличивается, и Pygame не может обнаружить мой голод. Могу я узнать, в чем проблема в моем коде?

def run(self):
        self.playing = True
        while self.playing:
            self.dt = self.clock.tick(FPS) / 1000
            self.hunger()
            self.events()
            self.update()
            self.draw()

    def hunger(self):
        HUNGEREVENT = pygame.USEREVENT + 1
        pygame.time.set_timer(HUNGEREVENT, 1000)
        self.all_sprites.update()
        pygame.display.flip()

    def food_food(self, x, y, cool):
        if cool < 0:
            cool = 0
        BAR_LENGTH = 100
        BAR_HEIGHT = 10
        fill = (cool / 100) * BAR_LENGTH
        outline_rect = pygame.Rect(x, y, BAR_LENGTH, BAR_HEIGHT)
        fill_rect = pygame.Rect(x, y, fill, BAR_HEIGHT)
        pygame.draw.rect(screen, GREEN, fill_rect)
        pygame.draw.rect(screen, WHITE, outline_rect, 2)

    def quit(self):
        pygame.quit()
        sys.exit()

    def update(self):
        self.all_sprites.update()


    def draw(self):
        self.screen.fill(BGCOLOR)
        self.all_sprites.draw(self.screen)
        font = pygame.font.SysFont('Arial', 15, True, False)
        self.food_food(120, 50, self.food_bar)
        text = font.render("Number of days:" , True, BLACK)
        screen.blit(text, [0, 110])
        font = pygame.font.SysFont('Arial', 30, True, False)
        text = font.render("= " + str(self.education_level), True, BLACK)
        screen.blit(text, [400, 40])
        font = pygame.font.SysFont('Arial', 30, True, False)
        text = font.render("= " + str(self.family_member), True, BLACK)
        screen.blit(text, [700, 40])
        font = pygame.font.SysFont('Arial', 30, True, False)
        text = font.render("= $" + str(self.money_bar), True, BLACK)
        screen.blit(text, [900, 40])
        self.all_sprites.update()
        pygame.display.flip()

    def events(self):
        # catch all events here
        HUNGEREVENT = pygame.USEREVENT + 1
        pygame.time.set_timer(HUNGEREVENT, 10000)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.quit()
            if event.type == HUNGEREVENT:
                self.food_bar = self.food_bar - 10
                print("hi")
                self.all_sprites.update()
                pygame.display.flip()
                if event.key == pygame.K_ESCAPE:
                    self.quit()

Заранее спасибо

1 Ответ

2 голосов
/ 09 октября 2019

Поскольку таймер перезапускается непрерывно pygame.time.set_time устанавливает время события таймера и перезапускает таймер.

Переместите вызов на

pygame.time.set_timer(HUNGEREVENT, 10000)

до инициализации вашего приложения, до основного цикла приложения. Например:

def run(self):
    self.playing = True

    # start timer event
    self.hunger()

    while self.playing:
        self.dt = self.clock.tick(FPS) / 1000
        self.events()
        self.draw()
        self.update()

def hunger(self):
    self.HUNGEREVENT = pygame.USEREVENT + 1
    pygame.time.set_timer(HUNGEREVENT, 1000)

# [...]

def events(self):

    # HUNGEREVENT = pygame.USEREVENT + 1        <--- delete
    # pygame.time.set_timer(HUNGEREVENT, 10000) <--- delete

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
                self.quit()
        if event.type == self.HUNGEREVENT:
            # [...]

Обратите внимание, что событие постоянно создается в очереди событий. Нет необходимости запускать его непрерывно.


Кроме того, я рекомендую удалить все вызовы на pygame.event.get() соответственно pygame.display.update() из приложения.
Выполните однократное обновление дисплея в конце основного цикла приложения. Например: 1010

def run(self):
    self.playing = True
    self.hunger()
    while self.playing:
        self.dt = self.clock.tick(FPS) / 1000
        self.events()
        self.draw()

        # update the disaplay
        self.update()

def update(self):
    self.all_sprites.update()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...