用噪点滤镜回忆童年电视机的雪花屏

news2025/1/20 0:53:22

介绍

相信很多人80,90后的同学对童年里电视机的突然出现刺啦刺啦的雪花屏记忆犹新,本期将用 pixi.js 来完成一个电视机播放动漫然后突然出现雪花屏的动画,里面主要讲解了如何使用pixi.js播放帧动画和如何用噪点滤镜制造雪花屏。

演示

正文

初始化渲染

import * as PIXI from "pixi.js"

const GAME_WIDTH = 800;
const GAME_HEIGHT = 600;

export default class Game {constructor(el) {this.isOpen = false;return this.init(el)}init(el) {this.app = new PIXI.Application({width: GAME_WIDTH,height: GAME_HEIGHT,backgroundColor: 0x000000,antialias: true,clearBeforeRender: true,antialias: true,autoDensity: true,resolution: window.devicePixelRatio || 1,});el.appendChild(this.app.view);this.loader = new PIXI.Loader();this.loader.add("tv", "./assets/SnowflakeScreen/TV.png").load(this.render.bind(this))return this;}render(loader, resources) {// 渲染this.resources = resources; // 创建容器this.container = new PIXI.Container();this.container.interactive = true;this.container.buttonMode = true;this.app.stage.addChild(this.container);this.tv = this.drawTV();this.container.addChild(this.tv);}drawTV() {// 绘制电视机let tv = PIXI.Sprite.from(this.resources.tv.texture);tv.anchor.set(0.5);tv.position.set(GAME_WIDTH / 2, GAME_HEIGHT / 2)tv.scale.set(.7, .7)tv.zIndex = 9;return tv;}
} 

初始化就是创建 pixi.js 应用,然后把生成后的视图追加到要传入的 el 元素节点上。这里我们还要先加载一张电视机png格式的图片。加载完这张图后,我们才会执行 render 方法进行渲染。先创建主容器 container 并添加到场景舞台中,同时开启 interactive 为了可以给他下面的元素设置 zIndex 来改变图层优先级。 然后就用刚加载的电视机图片的纹理图变成图片精灵添加到主容器中,就这样电视机就绘制到屏幕中央了。

雪花屏动画

实现雪花屏动画之前先来绘制一个电视屏幕:

export default class Game {
	render(loader, resources) {// 渲染// ...this.noise = this.drawNoise()this.noise.visible = truethis.container.addChild(this.noise);}drawNoise() {let noise = new PIXI.Graphics()noise.beginFill(0xffffff, .55)noise.drawRect(105, 100, 450, 360)noise.zIndex = 1return noise;}
} 

其实就是一个简单的白色透明矩形矩形放置在电视机之下。

然后,接下来就是在这个半透明矩形上用噪点滤镜,就可以出现雪花效果:

this.noise.filters = [new PIXI.filters.NoiseFilter(.6, Math.random())] 

里面可以传两个值,第一个值代表了噪声强度应为范围[0,1],第二个值则是用于噪声生成的随机量,感兴趣的可以看它具体的 shader 实现。

当然,现在画面虽然是雪花,但是它还不会动,非常简单,我们只要在每次渲染时改变它就好了。

export default class Game {
	render(loader, resources) {// 渲染// ...this.noise.filters = []this.app.ticker.add(this.step.bind(this));} step() {this.noise.filters = [new PIXI.filters.NoiseFilter(.6, Math.random())]}
} 

帧动画播放

先要准备好播放的帧动画图片:

export default class Game {
	render(loader, resources) {// 渲染// ... 	this.video = this.drawVideo()this.container.addChild(this.video);}	drawVideo() {let textureList = []for (let i = 1; i <= 28; i++) {let texture = PIXI.Texture.from(`assets/SnowflakeScreen/video/ezgif-frame-${(i + "").padStart(3, 0)}.jpg`);textureList.push(texture);};const video = new PIXI.AnimatedSprite(textureList);video.anchor.set(.5, .5)video.position.set(GAME_WIDTH / 2, GAME_HEIGHT / 2 - 10)video.scale.set(.48, .48)video.loop = false;video.animationSpeed = .16return video;}
} 

我们把这28张图片先生成纹理图,按照顺序保存到一个数组里面,然后可以把这个数组传入一个实例化的 AnimatedSprite 类中,里面可以控制它的大小位置是否循环或者播放速度等信息,添加到容器里就可以自动播放啦。

export default class Game {
	render(loader, resources) {// 渲染// ...this.video.visible = false;this.video.onComplete = () => {this.video.visible = false;this.noise.visible = true}this.container.on('pointerdown', (e) => {if(!this.isOpen){this.isOpen = true;this.video.visible = true;this.noise.visible = falsethis.video.gotoAndPlay(0)}else{this.isOpen = false;this.noise.filters.length = 0this.video.visible = false;this.noise.visible = true;}})}step() {if(!this.isOpen) return;this.noise.filters = [new PIXI.filters.NoiseFilter(.6, Math.random())]}
} 

最后加入一些逻辑比如播放完开启雪花屏,容器点击后播放动画等,非常快速的就可以实现这个电视机播放动漫然后突然出现雪花屏的动画效果了。

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/93074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端网页设计期末课程大作业:关于城市旅游的HTML网页设计 ——北京

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.2 OpenResty 快速入门

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.2 OpenResty 快速入门48.2.1 直接开干48 多级缓存 48.2 OpenResty 快速入门 48.2.1 直…

Linux(三) makefile与gdb调试

makefile mkefile文件中定义了一系列的规则来指定&#xff0c;哪些文件需要线编译&#xff0c;哪些后编译&#xff0c;哪些需要重新编译&#xff0c;甚至进行更复杂的功能操作&#xff0c;因为makefile就像一个Shell脚本一样&#xff0c;其中也可以执行操作系统的命令。 mkef…

java计算机毕业设计基于安卓Android的教学考勤系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

4个表格1个工具,解决客户的分类及管理

1897年&#xff0c;意大利经济学者帕累托发现&#xff1a;“社会上20%的人占有80%的社会财富”。 后来这一法则被发现可以适用到很多领域&#xff0c;包括客户管理。具体解释为“一家企业80%的收益来源于20%的客户”&#xff0c;即20%客户创造了企业80%的收益。 由于20%的客户…

分布式事务处理方案大 PK

[toc] 说好了写 TienChin 项目的&#xff0c;最近这个分布式事务算是一个支线任务吧&#xff0c;今天是再来一个短篇和小伙伴们总结一下分布式事务。 首先先说一个大原则&#xff1a;分布式事务能不用就不要用&#xff0c;毕竟这个用起来还是有一些麻烦的。当然&#xff0c;不…

B/S端界面控件DevExtreme内置的图标库介绍

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…

闯关

我回来啦&#xff01;停更的几个月&#xff0c;我生了个娃。6.7斤的小虎妞&#xff0c;健健康康、白白胖胖。她现在已经五个多月了&#xff0c;能抬头、会翻身、会咯咯咯地笑、能拿住小玩具、还能摘我的眼镜……过程挺曲折的。不夸张地说&#xff0c;鬼门关溜达了一圈。好在&am…

邀请函小程序开发,减少设计制作局限性

随着社交平台和互联网技术的发展&#xff0c;很多产品的类型都在不断地发生着改变&#xff0c;就连邀请产品现在都出现了电子版的邀请函&#xff0c;颠覆了我们对于传统纸质邀请函的认知。无论是在日常生活学习还是工作中我们都会用到邀请函&#xff0c;而现在越来越多的人倾向…

Android逆向中常用工具和命令

Android逆向中常用工具和命令 Wifi ADB Google Store wifi ADB 当没有数据线时&#xff0c;可以开启wifiADB adb connect 192.168.0.101:5555开始食用 android 运行shell命令 https://github.com/termux/termux-app/releases ADB shell 截图 vim ~/.bash_profile curre…

CAD怎么添加打印机设备?CAD打印机添加步骤

CAD打印时未在系统中找到合适的打印机该怎么办呢&#xff1f;CAD怎么添加打印机设备&#xff1f;本文小编就以浩辰CAD软件为例来给大家分享一下CAD添加打印机设备的详细操作步骤吧&#xff01; CAD添加打印机设备步骤&#xff1a; 首先在浩辰CAD中打开图纸文件&#xff0c;然后…

Speckle+IFC.js:开源BIM

2021年12 月底&#xff0c;我有机会参加了一个关于两个开源工具的网络研讨会&#xff1a;Speckle 和 IFC.js。 该网络研讨会是由一个名为 Agile BIM 的社区组织的&#xff0c;我对此也一无所知。 然而&#xff0c;我所知道的事实是开源软件开发在任何领域的重要性&#xff0c;开…

C#基于ASP.NET的社区人口管理系统

论文阐述了社区人口信息管理系统的设计与实现&#xff0c;并对该系统的需求分析及系统需要实现的设计方法作了介绍。该系统的基本功能包括用户登录&#xff0c;管理员信息管理&#xff0c;常住人口管理&#xff0c;迁出人口信息管理&#xff0c;迁入人口信息管理&#xff0c;查…

Docker安装RabbitMq延迟队列插件

// todo 文章目录一&#xff1a;下载延迟队列插件1. 地址2. 把刚刚下载的插件拖拽至虚拟机中二&#xff1a; 进入容器执行延迟队列插件1. 延迟插件拷贝到容器内部2. 进入容器&#xff0c;让插件生效3. 再次查看交换机类型一&#xff1a;下载延迟队列插件 1. 地址 &#xff1a…

20221216英语学习

今日新词&#xff1a; duplicate v.复制; 被复制; 复写; 复印; 重复; 使加倍; 使成双 September n.九月 scandal n.丑事&#xff0c;丑闻&#xff0c;丑行 considerate adj.考虑周到的&#xff0c;体贴的&#xff0c;体谅的 report n.报告, 报道, 汇报, 调查报告 across …

前端实现分页打印(一)

实现页面为结算单&#xff0c;也页面由固定头部&#xff0c;订单信息&#xff0c;产品列表&#xff0c;金额汇总&#xff0c;订单明细 其中产品列表需要动态计算分压&#xff0c;订单明细由于存在多个子单&#xff0c;订单收费项目可配置化&#xff0c;导致也存在多个分页需要处…

Apereo Cas在项目中接入

1.介绍 Apereo CAS的一个功能就是单点登录&#xff0c;统一的登录登出接口与页面&#xff0c;让系统中的模块只需要关注在业务点&#xff0c;而把安全认证的功能交给统一认证来做。所以客户端的集成主要是单点登录的集成&#xff0c;客户端指定需要做安全认证的页面&#xff0…

8年软件测试工程师感悟—我亲身经历的2022年软件质量工作

这两天和朋友谈到软件测试的发展&#xff0c;其实软件测试已经在不知不觉中发生了非常大的改变&#xff0c;前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&a…

PyTorch深度学习框架学习记录(2)--MNIST手写数字识别(续)

文章目录前言MNIST手写数字识别数据的准备工作数据的处理主干网络的定义损失函数的使用&#xff08;修改&#xff09;训练和预测运行前言 这个是我在学习中的其中一种方式实现MNIST手写的识别&#xff0c;思路我觉得比较清晰&#xff0c;后面会把另外的方法代码整理发布。 MN…

是否有 API 可供云对接?

涂鸦提供了两种维度供开发者拉取&#xff1a;应用维度、产品维度。 应用维度&#xff1a;设备绑定的用户属于开发者在涂鸦云应用中的用户&#xff0c;开发者间接拥有权限操作属于自己应用用户的设备&#xff1b; 产品维度&#xff1a;设备所属产品属于开发者在涂鸦云产品中的设…