Python Игра всегда кр sh или застряла | Pygame - PullRequest
1 голос
/ 01 февраля 2020

Я делаю хорошую игру с модулем pygame, и в основном я хочу сделать две вещи:

  1. Запустить игру в бесконечном l oop и увидеть если пользователь хочет закрыть игру, и если он хочет закрыть игру, выведите ему MessageBox.

  2. Во второй функции я хочу добавить все функции игры и рисовать на экране.

Моя проблема в том, что когда Я пытаюсь запустить их оба с помощью Thread, игра зависает и не отвечает.

Это проблема с моим компьютером, что означает, что он слишком слаб для запуска игры?
Или это проблема с моим кодом что мешает нормальной работе игры?

Код:

import pygame
import ctypes
from threading import Thread

class Game:
    def __init__(self):
        self.init = pygame.init()
        self.screen = pygame.display.set_mode((800, 500))
        self.allProcess()

    def runGame(self):
        self.running = True
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    ctypes.windll.user32.MessageBoxW(0, 'Thank you for Playing!', 'Thank You', 0)
                    self.running = False

    def items(self):
        self.screen.fill((255, 255, 255))
        pygame.draw.circle(self.screen, (0, 0, 255), (250, 250), 75)

    def allProcess(self):
        Thread(target=self.runGame).start()
        Thread(target=self.items).start()


if __name__ == '__main__':
    ins = Game()

1 Ответ

2 голосов
/ 01 февраля 2020

Pygame построен на SDL2, в котором есть некоторые правила относительно того, в каких потоках могут вызываться определенные функции. Например, для функций в модуле событий ( "вы можете вызывать эту функцию только в потоке, который устанавливает режим видео." ).

Вы должны почти всегда избегайте использования потоков, если они не являются абсолютно необходимыми! Они делают вашу программу недетерминированной c, труднее отлаживать, труднее тестировать, труднее поддерживать и часто медленнее (если вы не используете их эффективно). В вашей программе нет причин использовать потоки. В вашем случае они не нужны. Вместо этого вы должны сделать это:

import pygame
import ctypes

class Game:
    def __init__(self):
        self.init = pygame.init()
        self.screen = pygame.display.set_mode((800, 500))
        self.runGame()

    def runGame(self):
        self.running = True
        while self.running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    ctypes.windll.user32.MessageBoxW(0, 'Thank you for Playing!', 'Thank You', 0)
                    self.running = False

            self.screen.fill((255, 255, 255))
            pygame.draw.circle(self.screen, (0, 0, 255), (250, 250), 75)

            pygame.display.flip()  # Don't forget to call this to update the screen!



if __name__ == '__main__':
    ins = Game()

Меньше кода, детерминировано c, и, скорее всего, быстрее и с меньшим объемом памяти.

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