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?