关于数字雨特效的学习
程序员文章站
2022-07-10 21:10:35
数字雨特效在很多场景都得到应用,看起来非常具有科技感。因此,一次偶然的机会在CSDN中学习了如何制作特效雨,下面分享一下学习数字特效雨的收获,并在此基础上做了一些有趣的实验和创新(虽然效果不好hhh)用到的库有:pygame/numpy/random...
关于数字雨特效的学习
数字雨特效在很多场景都得到应用,看起来非常具有科技感。因此,一次偶然的机会在CSDN中学习了如何制作特效雨,下面分享一下学习数字特效雨的收获,并在此基础上做了一些有趣的实验和创新(虽然效果不好hhh)
用到的库有:pygame/numpy/random
下面先看一下制作特效雨的流程图
在特效雨制作开始之前,先载入需要的函数库
import pygame
import numpy as np
import random
1.构建显示框`
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))
(代码后有备注)
在这一部分中,有3点需要注意:
1.pygame.display.setmode(width,height),初始化窗口,前一个参数是宽度,后一参数是高度
2.pygame.surface()函数中的flags参数有两种选择:HWSURFACE——将创建surface对象放于显存中;SRCALPHA——每个像素包含一个alpha通道(用于控制透明度)
3.pygame.color()函数:在这个链接中描述的很详细
2.准备雨滴原料
texts = [font.render(str(i), True, (0, 255, 0)) for i in range(10)]
这里我们使用的雨滴是1-9的数字(可以根据自己的喜好选择,可以是字母或者其他,基于博主的实验,字符串应该也是可以的)
## 3.实现动画
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()
实现此数字雨特效的原理就是动画效果,核心函数是 winSur.blit()
效果如下
4.特效实验(用字符串)
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()
不过使用字符串效果还不是很好,会有重叠,影响视觉感受。
本文地址:https://blog.csdn.net/weixin_46438055/article/details/107429587