Почему эта программа Pygame не работает, поэтому, когда я наводю курсор на экран компьютера, он становится синим? - PullRequest
1 голос
/ 21 марта 2019

Здравствуйте, я новичок в pygame и пытаюсь сделать вступление для игры, в которой пользователь наводит курсор на экран компьютера, а затем экран становится синим, поэтому указывают, что при нажатии игра начнется. Тем не менее, синий прямоугольник просто не появляется? Кстати, introScreen похож на 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()

Нет сообщения об ошибке, просто синий прямоугольник не отображается? Пожалуйста, помогите, так как мне это нужно для школьного проекта.

Ответы [ 3 ]

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

Чтобы использовать многопоточность в PyGame, необходимо учитывать 2 вещи:

  1. Обработка цикла событий в главном потоке

  2. Выполнить все рисование и обновление окна в один поток. Если есть поток «вступление» и поток «игра», то поток «вступление» должен прерваться первым, прежде чем может начаться поток «игра».

В главном потоке (программе) вы должны объявить потоки и инициализировать переменные управления (состояния). Немедленно запустите поток «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)
0 голосов
/ 22 марта 2019

Попробуйте преобразовать изображения, которые вы хотите загрузить с .convert()

pygame.image.load("image file path").convert()

Или попробуйте преобразовать изображение в изображение с помощью .convert_alpha()

pygame.image.load("image file path").convert_alpha()

Pygame обнаруживает, что НАМНОГО проще и быстрее загружать изображения, преобразованные с помощью .convert(), а с .convert_alpha() он преобразует изображения с их альфа-слоями (например, прозрачность ...). Надеюсь, это поможет!

для получения дополнительной информации, смотрите эти результаты Google:

Я рекомендую первую ссылку, хотя эта ссылка довольно бессмысленная

0 голосов
/ 21 марта 2019

Попробуйте передать вступление непосредственно в функцию introLoop. Передайте аргументы в поток с параметром args ...

introThread = threading.Thread(target=introLoop, args=(intro))

Вам также придется переопределить функцию:

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