Как правильно заставить изображение исчезать в пигме, используя альфа-значение поверхности - PullRequest
2 голосов
/ 19 марта 2020

Я пытаюсь сделать фон моей игры блеклым за 30 секунд. Я делаю это, пытаясь изменить альфа-значение моей поверхности.

class Screen:
    def __init__(self):
        self.win = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Fire Game")
        self.win.fill((255, 255, 255))

        self.darkness = pygame.Surface((1200, 800))
        self.darkness.fill((0, 0, 0))
        self.darkness.set_alpha(0)
        self.win.blit(self.darkness, (0, 0))

        self.darknessLevel = 0
        self.darknessCount = 0
        pygame.display.flip()

    def run(self):
        self.darknessLevel = self.darknessCount / 10

        # two ways of changing the alpha value

        # 1. self.darkness.fill((0, 0, 0, self.darknessLevel), None, pygame.BLEND_RGBA_MULT)
        # 2. self.darkness.set_alpha(self.darknessLevel)

        self.win.blit(self.darkness, (0, 0))
        pygame.display.flip()
        self.darknessCount += 1
        print(self.darkness.get_alpha())
        print(self.darknessLevel)

первый вариант должен работать в соответствии с моими исследованиями, но не работает, и всякий раз, когда я использую оператор печати (self.darkness. get_alpha ()) Я вижу, что значение альфа не меняется. Второй способ изменяет альфа-значение, однако, как только альфа-значение достигает 1, все пути переходят в черный цвет. Экспериментируя с этим, я жестко закодировал set_alpha () и узнал, что чем выше число, тем быстрее оно становится черным. Я должен также упомянуть, что Screen.run () вызывается в моей основной игре, в то время как l oop.

пример:
self.darkness.set_alpha (1) становится черным
self. darkness.set_alpha (10) становится черным, но гораздо быстрее

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

1 Ответ

2 голосов
/ 19 марта 2020

Pygame имеет разные типы прозрачности. См. этот ответ .


Так что, если вы хотите использовать альфа-код на пиксель (ваш вариант 1, Pygame's do c называет это pixel alpha ) Вы должны создать поверхность с правильным флагом:

self.darkness = pygame.Surface((1200, 800), flags=pygame.SRCALPHA)

удалить линию self.darkness.set_alpha(0) (set_alpha используется для настройки прозрачности всей поверхности), и просто залить поверхность в л oop без каких-либо флагов:

    self.darkness.fill((0, 0, 0, self.darknessLevel))

Но если вы сделаете это, вы заметите, что столкнулись с той же проблемой, что и со вторым вариантом: экран слишком быстро темнеет.

Проблема в том, что вы продолжаете бить поверхность darkness поверх себя, пока ваш l oop работает. Итак, в первом кадре вы кладете его на белый экран. Во втором кадре вы блицуете чуть более темную поверхность darkness поверх и без того более темного экрана, поскольку он больше не является чисто белым. В третьем и каждом последующем кадре этот эффект умножается.

Таким образом, вы можете либо прекратить делать поверхность darkness темнее каждого кадра, чтобы эффект не размножался, либо перерисовать фон каждого кадра тоже.


Вариант 1:

import pygame

class Screen:
    def __init__(self):
        self.win = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Fire Game")
        self.win.fill((255, 255, 255))
        self.darkness = pygame.Surface((1200, 800), flags=pygame.SRCALPHA)
        self.darkness.fill((0, 0, 0))
        self.win.blit(self.darkness, (0, 0))
        self.darknessCount = 0
        pygame.display.flip()

    def run(self):
        self.win.fill((255, 255, 255))
        self.darkness.fill((0, 0, 0, self.darknessCount))
        self.win.blit(self.darkness, (0, 0))
        pygame.display.flip()
        self.darknessCount += 1

s = Screen()
c = pygame.time.Clock()
while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            quit()
    s.run()
    c.tick(60)

Opiton 2:

import pygame

class Screen:
    def __init__(self):
        self.win = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Fire Game")
        self.win.fill((255, 255, 255))
        self.darkness = pygame.Surface((1200, 800))
        self.darkness.fill((0, 0, 0))
        self.darkness.set_alpha(0)
        self.win.blit(self.darkness, (0, 0))
        self.darknessCount = 0
        pygame.display.flip()

    def run(self):
        self.win.fill((255, 255, 255))
        self.darkness.set_alpha(self.darknessCount)
        self.win.blit(self.darkness, (0, 0))
        pygame.display.flip()
        self.darknessCount += 1

s = Screen()
c = pygame.time.Clock()
while True:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            quit()
    s.run()
    c.tick(60)

Дополнительные примеры можно найти здесь:

Функция плавного перехода в черный цвет

Как уменьшить яркость экрана и вернуться обратно с помощью PyGame?

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