Почему эта программа pygame не работает, поэтому, когда я навожу курсор на экран компьютера, он становится синим?

avatar
JayMBH
20 марта 2019 в 23:33
121
3
1

Здравствуйте, я новичок в pygame, и я пытаюсь сделать заставку для игры, в которой пользователь наводит курсор на экран компьютера, а затем экран становится синим, поэтому укажите, что при нажатии на нее игра запустится. Однако синий прямоугольник просто не отображается? Кстати, заставка похожа на гифку, но состоит из множества разных кадров.

Это мой код:

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)

avatar
P3tray
22 марта 2019 в 19:59
0

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

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

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

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

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

дополнительную информацию см. в следующих результатах Google:

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

avatar
Rabbid76
21 марта 2019 в 18:47
1

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

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

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

В основном потоке (программе) вы должны объявить потоки и инициализировать переменные управления (состояния). Немедленно запустите вводный поток и запустите цикл обработки событий.
Я рекомендую реализовать как минимум 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)
avatar
Jack Walsh
20 марта 2019 в 23:41
0

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

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

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

def introLoop(intro):
JayMBH
21 марта 2019 в 17:12
0

Это только что ответило ошибкой: аргумент introLoop() после * должен быть итерируемым, а не логическим