关于数字雨特效的学习

关于数字雨特效的学习

关于数字雨特效的学习
数字雨特效在很多场景都得到应用,看起来非常具有科技感。因此,一次偶然的机会在CSDN中学习了如何制作特效雨,下面分享一下学习数字特效雨的收获,并在此基础上做了一些有趣的实验和创新(虽然效果不好hhh)
用到的库有:pygame/numpy/random
下面先看一下制作特效雨的流程图
image.png
在特效雨制作开始之前,先载入需要的函数库

import pygame
import numpy as np
import random
# 构建显示框
FONT_PX = 20
pygame.init()
winSur = pygame.display.set_mode((800, 1000))                             #构建显示框
font = pygame.font.SysFont('fangsong', 20)                                #字体
bg_suface = pygame.Surface((800, 1000), flags=pygame.SRCALPHA)            #界面设置
pygame.Surface.convert(bg_suface)
bg_suface.fill(pygame.Color(0, 0, 0, 13))                                 #颜色设置
winSur.fill((0, 0, 0))
# 准备雨滴原料
texts = [font.render(str(i), True, (0, 255, 0)) for i in range(10)]
# 实现动画
colums = int(800 / FONT_PX)                                               # 按窗口的宽度来计算可以在画板上放几列坐标并生成一个列表
drops = [0 for i in range(colums)]
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:                                     #退出窗口设定(关闭窗口按钮检测)
            exit()
    pygame.time.delay(33)
    winSur.blit(bg_suface, (0, 0))
    for i in range(len(drops)):
        text = random.choice(texts)
        winSur.blit(text, (i * FONT_PX, drops[i] * FONT_PX))               #surface.blit实现动画
        drops[i] += 1
        if drops[i] * 10 > 600 or random.random() > 0.95:                  #控制数字延申的屏幕长度
            drops[i] = 0
    pygame.display.flip()

这里我们使用的雨滴是1-9的数字(可以根据自己的喜好选择,可以是字母或者其他,基于博主的实验,字符串应该也是可以的)

(代码后有备注)
在这一部分中,有3点需要注意:
1.pygame.display.setmode(width,height),初始化窗口,前一个参数是宽度,后一参数是高度

2.pygame.surface()函数中的flags参数有两种选择:HWSURFACE——将创建surface对象放于显存中;SRCALPHA——每个像素包含一个alpha通道(用于控制透明度)

3.pygame.color()函数:在这个链接中描述的很详细
实现此数字雨特效的原理就是动画效果,核心函数是 winSur.blit()
效果如下
image.png
特效实验(用字符串)

import pygame
import numpy as np
import random

PANEL_width = 400
PANEL_highly = 500
FONT_PX = 20
pygame.init()

winSur = pygame.display.set_mode((PANEL_width, PANEL_highly))
font = pygame.font.SysFont('123.ttf', 25)
bg_suface = pygame.Surface((PANEL_width, PANEL_highly), flags=pygame.SRCALPHA)
pygame.Surface.convert(bg_suface)
bg_suface.fill(pygame.Color(0, 0, 0, 28))
winSur.fill((0, 0, 0))
letter = ['I','love','you']
texts = [
    font.render(str(letter[i]), True, (0, 255, 0)) for i in range(3)
]

column = int(PANEL_width / FONT_PX)
drops = [0 for i in range(column)]
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
        elif event.type == pygame.KEYDOWN:
            chang = pygame.key.get_pressed()
            if (chang[32]):
                exit()
    pygame.time.delay(90)
    winSur.blit(bg_suface, (0, 0))
    for i in range(len(drops)):
        text = random.choice(texts)
        winSur.blit(text, (i * FONT_PX, drops[i] * FONT_PX))
        drops[i] += 1
        if drops[i] * 10 > PANEL_highly or random.random() > 0.95:
            drops[i] = 0
    pygame.display.flip()

不过使用字符串效果还不是很好,会有重叠,影响视觉感受。
image.png