#python #multithreading #pygame
#python #pygame
Вопрос:
Здравствуйте, я новичок в pygame, и я пытаюсь сделать вводную часть для игры, в которой пользователь наводит курсор на экран компьютера, а затем экран становится синим, чтобы указать, что при нажатии на него игра начнется. Однако синий прямоугольник просто не отображается? Кстати, интроскрин похож на gif, но состоит из множества разных кадров.
Это мой код:
import pygame
import pygame.gfxdraw
import threading
pygame.init()
width = 800
height = 600
fps = 30
clock = pygame.time.Clock()
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue = (0, 0, 255)
screen = pygame.display.set_mode((width, height))
def introLoop():
while intro:
for i in range(0, 26):
clock.tick(8)
i = str(i)
introScreen = pygame.image.load("introScreen/" i ".gif")
introScreen = pygame.transform.scale(introScreen, (width, height))
screen.blit(introScreen, (30, 30))
pygame.display.flip()
def gameLoop():
while intro:
mouseX, mouseY = pygame.mouse.get_pos()
startRectArea = pygame.Rect(279, 276, 220, 128)
if startRectArea.collidepoint(mouseX, mouseY):
StartRect = pygame.draw.rect(screen, blue, (279, 276, 220, 128), 0)
pygame.display.update()
for event in pygame.event.get():
holder = 0
introThread = threading.Thread(target = introLoop)
gameThread = threading.Thread(target = gameLoop)
intro = True
introThread.start()
gameThread.start()
Сообщения об ошибке нет, оно просто не отображает синий прямоугольник?
Пожалуйста, помогите, так как мне это нужно для школьного проекта.
Ответ №1:
Чтобы использовать многопоточность в PyGame, вы должны учитывать 2 вещи:
- Обработайте цикл событий в основном потоке
- Выполняйте все рисование и обновление окна в одном потоке. Если есть поток «intro» и поток «game», то поток «intro» должен завершиться первым, прежде чем может начаться поток «game».
В главном потоке (программе) вы должны объявить потоки и инициализировать переменные управления (состояния). Немедленно запустите поток «intro» и запустите цикл событий.
Я рекомендую реализовать хотя бы pygame.QUIT
, который сигнализирует о том, что программа должна быть завершена ( run = False
).
Далее можно постоянно проверять, находится ли мышь в области запуска ( inStartRect = startRectArea.collidepoint(*pygame.mouse.get_pos())
):
introThread = threading.Thread(target = introLoop)
gameThread = threading.Thread(target = gameLoop)
run = True
intro = True
inStartRect = False
startRectArea = pygame.Rect(279, 276, 220, 128)
introThread.start()
while run:
if intro:
inStartRect = startRectArea.collidepoint(*pygame.mouse.get_pos())
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == pygame.MOUSEBUTTONDOWN and inStartRect:
intro = False
Во вводном потоке должен быть нарисован весь вводный экран, включая фон и синюю начальную область. Если вводная часть завершена (игра запущена), то в конце вводного потока запускается основной игровой цикл:
def introLoop():
i = 0
while run and intro:
clock.tick(8)
filename = "introScreen/" str(i) ".gif"
i = i 1 if i < 26 else 0
introScreen = pygame.image.load(filename)
introScreen = pygame.transform.scale(introScreen, (width, height))
screen.blit(introScreen, (30, 30))
if inStartRect:
pygame.draw.rect(screen, blue, (279, 276, 220, 128), 0)
pygame.display.flip()
gameThread.start()
Игровой поток запускается, когда вводный поток завершается. Таким образом, игровой поток может выполнять рисование игровой сцены:
def gameLoop():
while run:
clock.tick(60)
screen.fill(red)
# [...]
pygame.display.flip()
clock.tick(60)
Ответ №2:
Попробуйте передать intro непосредственно в introLoop
функцию. Передайте аргументы в поток с args
параметром…
introThread = threading.Thread(target=introLoop, args=(intro))
Вам также придется переопределить функцию:
def introLoop(intro):
Комментарии:
1. Это просто ответило ошибкой: аргумент introLoop() после * должен быть итерируемым, а не bool
Ответ №3:
Попробуйте преобразовать изображения, которые вы хотите загрузить с .convert()
pygame.image.load("image file path").convert()
Или попробуйте преобразовать изображение в изображение с помощью .convert_alpha()
pygame.image.load("image file path").convert_alpha()
Pygame считает, что намного проще и быстрее загружать изображения, которые конвертируются .convert()
, и с .convert_alpha()
его помощью преобразует изображения с их альфа-слоями (например, прозрачность …) Надеюсь, это поможет!
для получения дополнительной информации см. Эти результаты Google:
Я рекомендую первую ссылку, хотя эта ссылка довольно бессмысленна