如何在pygame中显示一个带有可移动透明圆形的大黑色矩形?

3

这个问题表述得不是很清楚。

本质上,我正在尝试制作一个多人Pac-Man游戏,当玩家扮演幽灵时,他们只能看到自己周围的一定半径范围。我最好的猜测是,将矩形覆盖整个迷宫,然后在幽灵矩形的中心切出一个圆形。但是,我不确定如何在pygame中完成最后一步。

我想补充一点的是,如果在pygame中实现这个功能,最好是以像素为单位的圆形,而不是平滑的圆形,但这不是必要的。

有什么建议吗?谢谢。

2个回答

1
我能想到的最好方法有点像是一种hack。在pygame外构建一个主要为黑色的图像,并在中心创建一个alpha值为零的圆形,然后将该对象叠加在幽灵角色上,只能看到其周围的圆形。我希望有更好的方法,但我不知道是什么。

好主意,我今晚会试一试并让你知道结果! - AuctortiA
1
绝对能胜任!谢谢你的想法,我现在会把它留着未回答,以防万一pygame支持使用我还不知道的某些命令来切割形状。 - AuctortiA

0

如果您只想显示圆形区域内的场景,则可以执行以下操作:

  • 清除显示。

  • 将绘图区域限制在围绕圆形区域的正方形区域内

  • 绘制场景

  • 在正方形区域上方绘制一个透明的圆形表面

圆形表面可以轻松地在运行时创建。定义圆形区域的半径(areaRadius)。创建一个边长为圆形区域半径两倍的pygame.Surface正方形。用不透明的黑色填充它,并在中间绘制一个透明的圆形:

circularArea = pygame.Surface((areaRadius*2, areaRadius*2), pygame.SRCALPHA)
circularArea.fill((0, 0, 0, 255))
pygame.draw.circle(circularArea, (0,0,0,0), (areaRadius, areaRadius), areaRadius)

表面的绘制区域可以通过.set_clip()进行限制。使用参数None调用该函数可移除剪切区域。在下面的代码中,screen是代表窗口的表面,areaCenter是屏幕上圆形区域的中心:

while run:

    # [...]

    # remove clipping region and clear the entire screen
    screen.set_clip(None)
    screen.fill(0)

    # set the clipping region to square around the circular area
    areaTopleft = (areaCenter[0]-areaRadius, areaCenter[1]-areaRadius)
    clipRect = pygame.Rect(areaTopleft, (areaRadius*2, areaRadius*2))
    screen.set_clip(clipRect)

    # draw the scene
    # [...]

    # draw the transparent circle on top of the rectangular clipping region
    screen.blit(circularArea, areaTopleft)  

    # clear the dripping region and draw all the things which should be visible in any case
    screen.set_clip(None)
    # [...]

    pygame.display.flip()


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