【问题标题】:Pygame surface with alpha not blitting transparency具有 alpha 的 Pygame 表面不传递透明度
【发布时间】:2018-11-04 03:26:32
【问题描述】:

当鼠标没有悬停在游戏上时,我正在尝试使游戏中的用户界面事物透明。但是由于某种原因,当我将图像的 alpha 值设置为透明时,什么也没有发生。下面是一些重现问题的可运行代码:

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

是不是因为我的文件而无法正常 blit 的原因?

【问题讨论】:

  • 我很确定问题只是因为您错误地对 ink_bar 进行了 blitting。只需删除每个变量名称前面的 self.self. 是您在对象中用来引用自身的名称),就像在 blit 调用中的 (ink_bar.x, ink_bar.y) 一样。经过这个小修改(并使用我自己加载的 256 x 256 图像),当没有悬停时,对象是不可见的,反之亦然。
  • 抱歉,位置参数中的 self 是拼写错误。最初我将其设置为 (0, 0) 但在此处将其更改为图像的位置以进行澄清。不管位置论点发生了什么,这个问题对我来说仍然奇怪地持续存在。

标签: python pygame pygame-surface


【解决方案1】:

set_alpha 方法似乎不适用于未转换的 png 文件。调用convert 方法也将大大提高 blit 性能:

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

它也不适用于每像素 Alpha 曲面(使用 convert_alpha 转换或使用 pygame.SRCALPHA 标志创建的曲面)。可以通过用透明的白色填充它们并传递pygame.BLEND_RGBA_MULT 特殊标志来更改每个像素表面的 alpha,例如:

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)

【讨论】:

  • 实际上,它似乎只不适用于未转换的 png 文件。它适用于jpg。我需要调查为什么会这样并改变答案。
  • 分析源代码对我来说有点太多的工作 atm,但也许开发人员知道为什么必须转换 png。这是邮件列表:pygame.org/wiki/info
猜你喜欢
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2019-05-18
相关资源
最近更新 更多