Поверхность Pygame с альфа-прозрачностью без бликов - PullRequest
0 голосов
/ 04 ноября 2018

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

import pygame
WHITE = (255, 255, 255)

class UI:
    def __init__(self):
        self.img = pygame.image.load("ink_bar_solid.png")
        self.img.set_alpha(0)
        self.ink_bar_rect = self.img.get_bounding_rect()
        self.x, self.y = 0, 10

resolution = (500, 500)
screen = pygame.display.set_mode(resolution)
mouse = pygame.mouse.get_pos
ink_bar = UI()
run = True

def mouse_over():
    if ink_bar.ink_bar_rect.collidepoint(mouse()):
        ink_bar.img.set_alpha(255)
    else:
        ink_bar.img.set_alpha(0)

while run:
    mouse_over()
    screen.fill(WHITE)
    screen.blit(ink_bar.img, (ink_bar.x, ink_bar.y))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            break
    pygame.display.flip()
pygame.quit()

Любая помощь очень ценится! Изменить: Я получил комментарий от кого-то, кто сказал, что они использовали свое собственное изображение, и оно работало нормально ... Я получаю это предупреждение при запуске программы:

libpng warning: iCCP: known incorrect sRGB profile

Это причина, по которой он не работает должным образом из-за моего файла?

1 Ответ

0 голосов
/ 04 ноября 2018

Метод set_alpha, похоже, не работает для неконвертированных файлов png. Вызов метода convert также значительно улучшит производительность блита:

self.img = pygame.image.load("ink_bar_solid.png").convert()

Он также не работает для альфа-поверхностей на пиксель (поверхности, преобразованные с convert_alpha или созданные с флагом pygame.SRCALPHA). Альфа-поверхность каждого пикселя может быть изменена путем заполнения их прозрачным белым цветом и передачи специального флага pygame.BLEND_RGBA_MULT, например ::

image = pygame.image.load('an_image.png').convert_alpha()
# Make a copy so that the original doesn't get modified.
transparent_image = image.copy()
transparent_image.fill((255, 255, 255, 100), special_flags=pygame.BLEND_RGBA_MULT)
...