Функция Pygame Fade to Black - PullRequest
       2

Функция Pygame Fade to Black

0 голосов
/ 26 февраля 2019

Я пишу игру в Python 3, используя последнюю версию Pygame.У меня есть функция, которая предназначена для постепенного исчезновения экрана, пока он не станет полностью черным.Это должно быть сделано путем многократного растрескивания черной альфа-поверхности на экране.

Но когда я проверяю ее, игра блокируется только до завершения цикла.Я подозреваю, что проблема с альфа-версией black_surface.

Я видел на форумах несколько вопросов о fade в pygame, но ни один из них не касался fade непосредственно в функциях.

Вот код:

def fade_to_black(screen):
    black_surface = Surface((screen.get_width(), screen.get_height()), flags= SRCALPHA)
    color = (255, 255, 255, 1)
    black_surface.fill(color)
    alpha_key = 1
    while alpha_key <= 255:
        screen.blit(black_surface, screen.get_rect())
        display.flip()
        alpha_key = alpha_key + 1
        time.wait(1)

Я просматривал документацию и форумы, но не могу найти никакого решения.Надеюсь, это не очевидная проблема, которую я бы пропустил ... Спасибо за помощь!

1 Ответ

0 голосов
/ 26 февраля 2019

Вы создаете поверхность с именем black_surface, но вы заполняете ее белым цветом.Заполните его черным (например, (0, 0, 0, 1)) и он может работать, но есть еще одна проблема:

Когда вы вызываете display.flip() внутри цикла, когда вы меняете поверхность экрана, дисплей может не обновиться, если выне позволяйте pygame обрабатывать события (например, вызывая pygame.event.get()), в зависимости от вашей ОС.Кроме того, пока выполняется цикл, вы не можете обрабатывать события вручную, например, событие QUIT.Поэтому, пока ваш экран становится черным, вы не можете выйти из игры.

Как правило, вы должны иметь только один основной цикл и не вызывать функции блокировки, такие как pygame.time.sleep, но, конечно, есть исключения).

Вот простой пример Sprite:

import pygame

class Fade(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.rect = pygame.display.get_surface().get_rect()
        self.image = pygame.Surface(self.rect.size, flags=pygame.SRCALPHA)
        self.alpha = 0
        self.direction = 1

    def update(self, events):
        self.image.fill((0, 0, 0, self.alpha))
        self.alpha += self.direction
        if self.alpha > 255 or self.alpha < 0:
            self.direction *= -1
            self.alpha += self.direction

def main():
    pygame.init()
    screen = pygame.display.set_mode((500, 500))
    sprites = pygame.sprite.Group(Fade())
    clock = pygame.time.Clock()

    while True:
        events = pygame.event.get()
        for e in events:
            if e.type == pygame.QUIT:
                return
        sprites.update(events)
        screen.fill((30, 30, 30))
        pygame.draw.rect(screen, pygame.Color('dodgerblue'), (100, 100, 100, 100))
        sprites.draw(screen)
        pygame.display.update()
        clock.tick(60)

if __name__ == '__main__':
    main()

enter image description here

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