Почему моя игра выбрасывает sh один раз, когда запускается l oop (Pygame) - PullRequest
1 голос
/ 21 марта 2020

мой код:

def shop_button(self):
    click = pygame.mouse.get_pressed()
    if click[0] == 1:
        self.open_shop()  # draws shop
        self.inshop = True
        while self.inshop:
            pygame.time.delay(10)
            mousepos = pygame.mouse.get_pos()
            if click[0] == 1 and b.mouse_on_button(mousepos[0], mousepos[1], b.escapex, b.escapex2, b.escapey, b.escapey2):
                self.inshop = False

всякий раз, когда вы нажимаете на кнопку магазина, эта функция запускается, хотя self.inshop находится внутри оператора if, подобного такому, игра мгновенно перестает отвечать и вылетает. Это может быть очень простым решением, так как я почти новичок в Pygame и в языке python в целом. Однако, с учетом сказанного, я не могу найти решение где-либо еще.

1 Ответ

1 голос
/ 21 марта 2020

В игре нет sh, она не отвечает, потому что у вас есть oop внутри основного приложения l oop. Внутренний l oop не имеет обработки событий и обновления дисплея.

def shop_button(self):
   # [...]

   while self.inshop:
           pygame.time.delay(10)
           mousepos = pygame.mouse.get_pos()
           # [...]

Позиция, возвращаемая pygame.mouse.get_pos(), считывается из внутренний кеш. Кэш обновляется, когда события обрабатываются либо pygame.event.pump(), либо pygame.event.get().
Это означает, что если вы извлекаете позицию в al oop, не обрабатывая события, позиция не отражает текущую позицию мыши, она постоянно находится в той же позиции, позиция в точке, когда вызывается pygame.event.get(), перед l oop.
Кроме того, дисплей Surface не изменится без обновления дисплея: pygame.display.flip() или pygame.display.update().

У вас есть основное приложение l oop , используй это. Основное приложение l oop должно:

  • обрабатывать события либо pygame.event.pump(), либо pygame.event.get().
  • обновить игровое состояние и положение объектов в зависимости от входных событий и времени (соответственно, фреймов)
  • очистить весь экран или нарисовать фон
  • нарисовать всю сцену (blit все объекты )
  • обновить отображение с помощью pygame.display.update() или pygame.display.flip()

Никогда не реализованы вложенные циклы приложений. Вы должны изменить поток управления и дизайн вашего приложения.

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