Pygame 实现淡入淡出效果

淡出演示。(这个是我写的一个控件模块透明度演示,与文章最终不同)

首先要了解,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即可。

发表回复