淡出演示。(这个是我写的一个控件模块透明度演示,与文章最终不同)
首先要了解,pygame中透明度取值 0-255,和RGB其他颜色一样,
其次,特别重要的一点,要使用透明度必须将 surface 通过 convert_alpha() 转换。
渲染的文本还不能直接使用透明度。。。
所以首先我们需要创建一个Surface对象,作为淡出的地方。
surface = pygame.Surface((200, 100))
textsurface = pygame.Surface((200, 100))
surface.set_colorkey((0, 0, 0))
textsurface.set_colorkey((0, 0, 0))
surface = surface.convert_alpha()
textsurface = textsurface.convert_alpha()
然后随便定义一个透明度值
transparency = 255 #这个需要定义在主循环外
Code language: PHP (php)
定义字体
text = pygame.font.SysFont("Arial", 50))
Code language: JavaScript (javascript)
因为255能被15整除,刚好得17,所以这个淡出演示总共需要花费 17/60 秒(60帧来算)
接下来我们要在主循环中递减透明度
transparency -= 15
然后打印上文字
textsurface.blit(text.render("Hello", 1, (0, 0, 0)), (0, 0))
Code language: CSS (css)
设置该文字surface的透明度
textsurface.set_alpha(transparency)
surface.blit(textsurface, (0, 0))
Code language: CSS (css)
再将主surface贴到screen上
screen.blit(surface, (0, 0))
Code language: CSS (css)
问我直接把textsurface贴到screen上不就行了的话,你这么做也行,不过我留一个主surface是为了你创作空间(比如开头gif图中的边框),你要直接贴也可以
全部代码
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
clock = pygame.time.Clock()
transparency = 255
text = pygame.font.SysFont("Arial", 50)
surface = pygame.Surface((200, 100))
textsurface = pygame.Surface((200, 100))
surface.set_colorkey((0, 0, 0))
textsurface.set_colorkey((0, 0, 0))
surface = surface.convert_alpha()
textsurface = textsurface.convert_alpha()
textsurface.blit(text.render("Hello", 1, (0, 0, 0)), (0, 0))
textsurface.set_alpha(transparency)
surface.blit(textsurface, (0, 0))
while True:
#不写退出事件了,你自己写
clock.tick(60)
screen.fill((255,255,255))
screen.blit(surface, (0, 0))
transparency -= 15
surface.set_alpha(transparency if transparency else 0)
pygame.display.flip()
Code language: PHP (php)
当我把代码复制下来再搞到总代码里去的时候,我有点懵。
因为按照我原本的想法,将surface和textsurface全部写在主循环中。
但是现在只需要设置透明度,并不涉及其他地方。
所以我就把定义的部分全写在了主循环外,现在代码有点臃肿,你们自己改改吧,我只是提供一个思路。
淡入只需要将 -= 15 改成 +=15即可,递加15,且要把原本的透明度transparency改为0即可。