【Canvas与艺术】砂落字现

【注意】

本作代码需要在服务器端执行,不可用浏览器直接打开运行。

如何安装服务器端请参考:https://www.cnblogs.com/heyang78/p/3339235.html

【原理】

雨粒子落下时,如果当前点不是黑点,则化身为金字的一个像素点。

【效果】

【代码】

<!DOCTYPE html>
<html lang="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
     <title>砂落字现粒子特效</title>
     </head>

     <body οnlοad="draw()">
        <img id="maxim" src="71.maxim.png" style="display:none"/>
        <canvas id="hideCanvas"  style="display:none"></canvas>
        <canvas id="myCanvas" width="100px" height="100px" style="border:0px dashed black;">
            出现文字表示您的浏览器不支持HTML5
        </canvas>
     </body>
</html>
<script type="text/javascript">
<!--
/*****************************************************************
* 将全体代码(从<!DOCTYPE到script>)拷贝下来,粘贴到文本编辑器中,
* 另存为.html文件,再用chrome浏览器打开,就能看到实现效果。
******************************************************************/

// 画布宽
var Width=1200;

// 画布高
var Height=512;

// 绘图上下文
var context;

// 舞台对象
var stage;

// 肇始函数
function draw(){
    // 获得img
    var img = document.getElementById("maxim");

    // 用于从中取图片数据的隐藏canvas
    var hideCanvas=document.getElementById('hideCanvas');  
    hideCanvas.width=img.width;
    hideCanvas.height=img.height; 
    hideCtx=hideCanvas.getContext('2d');  
    hideCtx.drawImage(img,0,0);

    // 真正用于画图的Canvas
    var canvas=document.getElementById('myCanvas');    
    Width=img.width;
    Height=img.height;
    canvas.width=Width;
    canvas.height=Height;    
    context=canvas.getContext('2d');    
    
    // 准备
    stage=new Stage(10000);    
    stage.init();

    // 开幕
    animate();
};

// 循环播放动画
function animate(){    
    // 直接清屏则无拖尾效果
    //context.clearRect(0,0,Width,Height);    

    // 加上半透明蒙层带上的拖尾效果
    context.fillStyle = 'rgb(0,0,0,.07)'   
    context.rect(0, 0, Width, Height) 
    context.fill()  

    stage.update();
    stage.paintBg(context);
    stage.paintFg(context);     

    if(true){
        window.requestAnimationFrame(animate);
    }
}

// 舞台类
function Stage(count){
    // 雨粒子数组
    this.rainArr=new Array(count);

    // 金粒子数组
    this.goldenArr=new Array(count);
    
    // 初始化
    this.init=function(){
        for(var i=0;i<this.rainArr.length;i++){
            var item={};
            item.x=Math.random()*Width;
            item.y=Math.random()*Height;
            item.vy=Math.random()*10+1;

            this.rainArr[i]=item;
        }
    }

    // 更新粒子的位置
    this.update=function(){
        this.rainArr.forEach(function (item, i) {
            // 下坠
            item.y+=item.vy;

            // 取当前点的像素
            let data = hideCtx.getImageData(item.x,item.y,1,1).data;

            // 如果RGB不都等于0,说明当前坐标是金字位置
            if(data[0]!=0 || data[1]!=0 || data[2]!=0){
                var pt={};
                pt.x=item.x;
                pt.y=item.y;
                stage.goldenArr.push(pt);// 保存此点

                // 原像素点置黑,此举是为了金沙能继续下落
                var blackImageData=new ImageData(1,1);
                blackImageData.data[0]=0;
                blackImageData.data[1]=0;
                blackImageData.data[2]=0;
                hideCtx.putImageData(blackImageData,item.x,item.y);

                // 显影归零
                item.y=0;
                item.x=Math.random()*Width;
            }

            // 越界归零
            if(item.y>Height){
                item.y=0;
                item.x=Math.random()*Width;
            }
        })        
    };

    //  画背景
    this.paintBg=function(ctx){
        // 背景黑色
        ctx.fillStyle="black";
        ctx.fillRect(0,0,Width,Height);

        ctx.fillStyle="White";
        ctx.fillText("砂落字现 by:逆火",Width-100,Height-20);
    };


    // 画前景
    this.paintFg=function(ctx){
        this.rainArr.forEach(function (item, i) {
            ctx.fillStyle="yellow";
            ctx.fillRect(item.x,item.y,2,2);
        })    
        
        this.goldenArr.forEach(function (pt, i) {
            ctx.fillStyle="yellow";
            ctx.fillRect(pt.x,pt.y,1,1);
        })
    };
}

/*----------------------------------
自开天辟地以来,
炼狱与世人同在,
时间与牛马同行,
周而复始,昼夜不息...
----------------------------------*/
//-->
</script>

【需要用到的底图】

请将上图另存为 71.maxim.png,与代码配合使用。

【参考资料】

https://www.cnblogs.com/heyang78/p/7599468.html

Javascript中的图像数据对象:Image、ImageData 和 ImageBitmap_js image-CSDN博客

END

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

USB - USB Gadget on Linux

February, 2012. Embedded Linux Conference 2012. Agenda Introduction to USB USB Gadget API Existing Gadgets Design your own Gadget Demo Conclusio About the Author Software engineer at Adeneo Embedded Linux, Android Main activities: – BSP adaptation – Driv…

PXVDI企业级PVE免费桌面虚拟化部署教程ProxmoxVE

什么是PXVDI&#xff1f; PXVDI是一款基于Proxmox VE为底层的可商用的免费云桌面套件。对熟悉PVE的人来说&#xff0c;这点非常的点赞。首先是PVE是免费的&#xff0c;其次PVE的免费云桌面方案也极为少数。 根据官方提出的价格清单&#xff0c;免费版和商业版在功能上主要的区…

使用CURL命令确定Access-Control-Allow-Origin问题

一、问题描述 有前端小伙伴反馈ajax请求遇到跨域问题&#xff0c;也让后端小伙伴设置了跨域允许&#xff0c;但诡异的事情是在前端小伙伴的微信开发者工具中Network headers中看到了两行&#xff1a;Access-Control-Allow-Origin&#xff0c;其中居然出现了&#xff1a;“Acce…

51单片机—DS18B20温度传感器

目录 一.元件介绍及原理 二&#xff0c;应用&#xff1a;DS18B20读取温度 一.元件介绍及原理 1.元件 2.内部介绍 本次元件使用的是单总线 以下为单总线的介绍 时序结构 操作流程 本次需要使用的是SKIP ROM 跳过&#xff0c; CONVERT T温度变化&#xff0c;READ SCRATCHPAD…

Linux:系统初始化,内核优化,性能优化(2)

优化ssh协议 Linux&#xff1a;ssh配置_ssh配置文件-CSDN博客https://blog.csdn.net/w14768855/article/details/131520745?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171068202516800197044705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fb…

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 &#xff08;1&#xff09;布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 &#xff08;1&#xff09;redis高可用 &#xff08;2&#xff09;限流降级 &#xff08;3&#xff09;数据预热 一、缓存穿透 1、概念 缓…

JavaWeb后端——分层解耦 IOC DI

分层/三层架构概述 三层架构&#xff1a;Controller、Service、Dao 解耦/IOC&DI概述 分层解耦 容器称为&#xff1a;IOC容器/Spring容器 IOC 容器中创建&#xff0c;管理的对象&#xff0c;称为&#xff1a;bean 对象 IOC&DI入门 实现 IOC&DI 需要的注解&#…

【MySQL】 MySQL的内置函数——日期函数、字符串函数、数学函数、聚合函数、其他函数

文章目录 MySQL1. 日期函数1.1 查看时间1.2 对时间进行计算 2. 字符串函数2.1 字符串查找2.2 字符串修改显示 3. 数学函数4. 聚合函数5. 其他函数 MySQL 1. 日期函数 在MySQL中&#xff0c;提供了多种时间函数供我们使用&#xff0c;其中包括用于查看时间的函数和计算日期的函数…

基于java+springboot+vue实现的高校教师工作量管理系统(文末源码+Lw+ppt)23-451

摘 要 高校教师工作量管理系统采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的java进行编写&#xff0c;使用了springboot框架。该系统从两个对象&#xff1a;由管理员和教师来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对…

Jmeter文件上传不成功问题

前言 最近好忙呀&#xff0c;项目上线然后紧接着又客户培训了&#xff0c;由于项目有个模块全是走配置的&#xff0c;所以导致问题不断&#xff0c;近期要培训为了保障培训时客户同时操作的情况&#xff0c;所以把我从功能端抽出来做压测了&#xff0c;之前安排了2个同事写压测…

数据结构的基本框架以及泛型

目录 集合框架复杂度大O的渐进表示法 装包(箱)或者拆包(箱)装包拆包 泛型泛型的上界泛型方法求最大值 集合框架 Java的集合框架,Java Collection Framework 又被称为容器container, 定义在java.util包下的一组 interfaces 和其实现类 classes interface: 接口 abstracb class…

基于Linux内核的socket编程(TCP)的C语言示例

原文地址&#xff1a;https://www.geeksforgeeks.org/socket-programming-cc/ 服务端&#xff1a; #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <unistd.h>#…

【鸿蒙HarmonyOS开发笔记】开发小技巧之Blank组件与layoutWeight属性的使用

Blank组件 Blank可作为Column和Row容器的子组件 该组件不显示任何内容&#xff0c;并且会始终充满容器主轴方向上的剩余空间&#xff0c;效果如下&#xff1a; Entry Component struct BlankPage {build() {Column({ space: 50 }) {Row() {Image($r(app.media.icon_bluetoot…

uniapp修改头像,选择图片

一、页面效果 二、手机上的效果 使用过的实例&#xff1a; 手机上就会显示类似如下&#xff1a; 三、代码 <view class"cleaner-top" click"chooseImg"><view class"cleaner-avatar"><image :src"imgArr" mode"…

蚁群算法实现 - 全局路径规划算法

参考博客&#xff1a; &#xff08;1&#xff09;【人工智能】蚁群算法(密恐勿入) &#xff08;2&#xff09;计算智能——蚁群算法 &#xff08;3&#xff09;蚁群算法(实例帮助理解) &#xff08;4&#xff09;【数之道 04】解决最优路径问题的妙招-蚁群ACO算法 &#xff08;…

《A ConvNet for the 2020s》阅读笔记

论文标题 《A ConvNet for the 2020s》 面向 2020 年代的 ConvNet 作者 Zhuang Liu、Hanzi Mao、Chao-Yuan Wu、Christoph Feichtenhofer、Trevor Darrell 和 Saining Xie 来自 Facebook AI Research (FAIR) 和加州大学伯克利分校 初读 摘要 “ViT 盛 Conv 衰” 的现状&…

EI Scopus检索 | 第二届大数据、物联网与云计算国际会议(ICBICC 2024) |

会议简介 Brief Introduction 2024年第二届大数据、物联网与云计算国际会议(ICBICC 2024) 会议时间&#xff1a;2024年12月29日-2025年1月1日 召开地点&#xff1a;中国西双版纳 大会官网&#xff1a;ICBICC 2024-2024 International Conference on Big data, IoT, and Cloud C…

视频基础知识(一) 视频编码 | H.26X 系列 | MPEG 系列 | H.265

文章目录 一、视频编码二、 H.26X 系列1、H.2612、H.2633、H.2643.1 I帧3.2 P帧3.3 B帧 4、H.265 三、 MPEG 系列1、MPEG-12、MPEG-23、MPEG-44、MPEG-7 &#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&…

OSPF协议全面学习笔记

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 OSPF协议全面学习笔记 1、OSPF基础2、DR与BDR3、OSPF多区域4、虚链路Vlink5、OSPF报文6、LSA结构1、一类/二类LSA&#xff08;Router-LSA/Network-LSA&#xff09; 更新完善中... 1、…

STM32的USART能否支持9位数据格式话题

1、问题描述 STM32L051 这款单片机。平常的 USART 串口传输是 8 位数据&#xff0c;但是他的项目需要用串口传输 9 位数据。当设置为 8 位数据时&#xff0c;串口响应中断正常。但是&#xff0c;当设置为 9 位数据时&#xff0c;串口就不产生中断了。USART2 的 ISR 寄存器 RXN…