Pygame中的绘制表面透明度?

5
我正在使用Python和Pygame编写一个捕食-猎物模拟器,用于图形表示。我正在制作这样一个功能:您可以与生物“互动”(杀死它、选择它并跟随它在世界中移动等)。目前,当您单击一个生物时,它周围会出现一个厚实的圆圈(由gfxdraw类中的各种抗锯齿圆圈制成),表示您已成功选择了它。
我的目标是使该圆圈透明,但根据文档,您无法为绘制的表面设置alpha值。我已经看到了矩形的解决方案(通过创建一个单独的半透明表面,将其blitting,然后在其上绘制矩形),但没有看到半填充圆的解决方案。
你有什么建议吗?谢谢:)

如果您创建了一个表面(surface),在其上绘制圆形,可以使用Surface.set_alpha方法。然后将该表面(blit)到屏幕上。 - ninMonkey
1个回答

11

请看下面的示例代码:

import pygame

pygame.init()
screen = pygame.display.set_mode((300, 300))
ck = (127, 33, 33)
size = 25
while True:
  if pygame.event.get(pygame.MOUSEBUTTONDOWN):
    s = pygame.Surface((50, 50))

    # first, "erase" the surface by filling it with a color and
    # setting this color as colorkey, so the surface is empty
    s.fill(ck)
    s.set_colorkey(ck)

    pygame.draw.circle(s, (255, 0, 0), (size, size), size, 2)

    # after drawing the circle, we can set the 
    # alpha value (transparency) of the surface
    s.set_alpha(75)

    x, y = pygame.mouse.get_pos()
    screen.blit(s, (x-size, y-size))

  pygame.event.poll()
  pygame.display.flip()

在此输入图像描述


谢谢!colorkey 起了作用(虽然代码变得比我希望的更加复杂了一些)。只有一个问题:您使用 pygame.event.poll 有什么特别的原因吗?干杯。 - Pabce
2
是的,因为我使用pygame.MOUSEBUTTONDOWN作为参数调用pygame.event.get来仅检查鼠标点击事件。如果这样做,您必须调用pygame.event.poll,否则事件队列会填满,并且窗口在一段时间后变得无响应。如果您只调用pygame.event.get()而没有任何参数(通常在游戏中这样做),则没有理由这样做。 - sloth
2
问题:将s的创建和设置(从s = pygame.Surface(...s.set_alpha(...)这几行)放在主循环内而不是之前,是否有特别的原因?它们似乎是常量,因此似乎只需要xyblit即可。 - MestreLion
没有,完全没有特别的原因 :-) - sloth
它只在表面背景颜色与屏幕相同时才起作用,例如将背景纹理设置为屏幕,如何使表面产生相同的效果?需要使表面背景透明而不是对象。例如:香蕉走进房子,当打开门时,香蕉会淡出。解决这个问题的答案是:https://dev59.com/y3RC5IYBdhLWcg3wVvjL surface = pygame.Surface((50, 50), pygame.SRCALPHA, 32) surface = surface.convert_alpha() pygame.draw.circle(... - e-info128

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接