Canvas绘制简易雨滴碰撞效果

news2024/11/27 14:32:42

实现会动的图形,向下播放多张静态的图片。一秒内要大于屏幕刷新的帧数(60) 也就是每隔1/60s执行一次函数在每次绘制的正方形上添加一个背景色为白色蒙板。

效果图

在这里插入图片描述

源代码


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Canvas雨滴效果</title>
    <style>
        body {
            margin: 0;
        }

        .rain {
            display: block;
            background-color: #000;
        }
    </style>
</head>

<body>
    <canvas class="rain"></canvas>
    <script>
        // 1.获取canvas并设置大小
        var canvas = document.querySelector('.rain');
        var ctxWidth, ctxHeight; // 定义画布的宽高
        ~~function setResize() { // 根据浏览器窗口的改变,实时改变canvas画布的宽高,和浏览器保持一致
            window.onresize = arguments.callee;
            ctxWidth = window.innerWidth;
            ctxHeight = window.innerHeight;
            canvas.width = ctxWidth;
            canvas.height = ctxHeight;
        }();
        var ctx = canvas.getContext('2d');

        // 2.绘制单个会动的雨滴,根据单个雨滴进行接下来的雨滴对象Rain处理
        /* var y = 10;
        setInterval(function () {
            // 添加雨滴蒙版,使用透明色,使雨滴向上看起来有逐渐透明的效果
            ctx.fillStyle = 'rgba(0,0,0,0.05)';
            ctx.fillRect(0, 0, ctxWidth, ctxHeight);
        
            //绘制雨滴小矩形
            ctx.fillStyle = 'blue';
            ctx.fillRect(10, y++, 4, 10);
        }, 1000 / 60); */

        function random(min, max) { // 生成从min到max之间的随机数
            return Math.random() * (max - min) + min;
        }

        // 3.设置雨滴对象
        function Rain() { };
        Rain.prototype = {
            init: function () {
                this.x = random(0, ctxWidth);
                this.y = 0;
                this.vY = random(4, 5); // 雨滴在Y轴上运动的速度
                this.h = random(0.8 * ctxHeight, 0.9 * ctxHeight); // 雨滴停止的Y轴位置,整个画布的80%-90%高度的地方
                this.r = 1; // 圆形半径
                this.vR = 1; // 圆形半径变化的速度
            },
            draw: function () {
                if (this.y <= this.h) {
                    //绘制雨滴小矩形
                    ctx.beginPath();
                    ctx.fillStyle = '#31f7f7';
                    ctx.fillRect(this.x, this.y, 4, 10);
                } else {
                    ctx.beginPath();
                    ctx.strokeStyle = '#31f7f7';
                    ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2);
                    ctx.stroke();
                }
            },
            move: function () {
                if (this.y <= this.h) {
                    this.y += this.vY;
                } else {
                    if (this.r <= 100) {
                        this.r += this.vR;
                    }
                    else {
                        this.init();
                    }
                }
                this.draw();
            }

        }

        // 创建多个雨滴的函数,将雨滴push进入arrRains中
        var arrRains = [];

        function createRain(num) {
            // 每200ms生成一滴雨滴
            for (var i = 0; i <= num; i++) {
                setTimeout(function () {
                    var rain = new Rain();
                    rain.init();
                    rain.draw();
                    arrRains.push(rain);
                }, 200 * i);
            }
        }

        createRain(50);

        setInterval(function () {
            // 添加雨滴蒙版,使用透明色,使雨滴向上看起来有逐渐透明的效果
            ctx.fillStyle = 'rgba(0,0,0,0.05)';
            ctx.fillRect(0, 0, ctxWidth, ctxHeight);
            for (item of arrRains) {
                item.move();
            }
        }, 1000 / 60); // 每1/60秒执行一次函数
    </script>
</body>

</html>
							

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

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

相关文章

数据库进阶教学——数据库故障恢复(日志文件)

目录 一、日志简介 二、日志文件操作 1、查看日志状态 2、开启日志功能 3、查看日志文件 4、查看当前日志 5、查看日志中的事件 6、删除日志文件 7、查看和修改日志文件有效期 8、查看日志文件详细信息 三、删除的数据库恢复 一、日志简介 日志是记录所有数据库表结…

全国首批!中国儿童青少年戏剧艺术普及推广中心——福建省艺术馆、福州市文化馆推广中心授牌仪式在福州举办

2023年11月1日&#xff0c;由中国儿童艺术剧院、文化和旅游部全国公共文化发展中心主办&#xff0c;福建省文化和旅游厅支持&#xff0c;福建省艺术馆、福州市文化和旅游局承办&#xff0c;福州市文化馆协办的“中国儿童青少年戏剧艺术普及推广中心——福建省艺术馆、福州市文化…

Centos 7.x上利用certbot申请Let‘s Encrypt的SSH证书(HTTPS证书)

目录 01-安装Certbot02-在网站的根目录依次新建文件夹.well-known和acme-challenge03-申请证书 要在CentOS 7.x上为域名申请Let’s Encrypt证书&#xff0c;你可以使用Certbot工具&#xff0c;它是一个自动化证书颁发工具&#xff0c;用于管理Let’s Encrypt证书。以下是在Cent…

天津优选Java培训机构 影响Java培训费用的因素

Java作为如今流行的计算机编程语言&#xff0c;其优势在于言语简略、面向对象&#xff0c;并且应用广泛。随着市场对于Java开发人员的需求越来越大&#xff0c;越来越多非本专业的人也通过培训转行进入IT行业。 Java的就业优势 市场需求大&#xff1a;Java人才的市场需求很大…

高匿IP有什么作用

在互联网的蓬勃发展中&#xff0c;IP地址作为网络通信的基础&#xff0c;一直扮演着举足轻重的角色。而在诸多IP地址中&#xff0c;高匿IP地址则是一种特殊类型&#xff0c;其作用和价值在某些特定场合下尤为突出。那么&#xff0c;高匿IP地址究竟有哪些用处呢&#xff1f; 首先…

无声的世界,精神科用药并结合临床的一些分析及笔记(十)

目录 回 “ 家 ” 克服恐惧 奥沙西泮 除夕 酒与药 警告 离别 回 “ 家 ” 她的锥切手术进行的很顺利&#xff0c;按计划继续返回安定医院调节心理状态&#xff0c;病友们都盼着我们回“家”。当我俩跨入病区&#xff0c;大家都涌过来帮我们大包小包的拎着行李&#xff0…

Airtest工具根据App页面文字信息提取坐标进行截图保存在自定义文件夹

Airtest工具根据App页面文字信息提取坐标进行截图保存在自定义文件夹 一、项目背景 在一个项目中&#xff0c;选项被选中和未选中的节点元素的属性值无变化&#xff0c;通过AI识别率达不到百分百&#xff0c;想着通过计算图片的HSV值来判断选择能否被选中。&#xff08;HSV比…

Android笔记(十一):Compose中使用ViewModel

通过ViewModel组件用于保存视图中需要的数据。ViewModel主要目的是将与用户界面相关的数据模型和应用程序的逻辑与负责实际显示和管理用户界面以及与操作系统交互的代码分离开来&#xff0c;为UI界面管理数据。常见的管理方式主要有&#xff1a;LiveData和StateFlow两种形式来实…

路由器基础(十一):ACL 配置

访问控制列表 (Access Control List,ACL) 是目前使用最多的访问控制实现技术。访问控制列表是路由器接口的指令列表&#xff0c;用来控制端口进出的数据包。ACL适用于所有的被路由协议&#xff0c;如IP、IPX、AppleTalk 等。访问控制列表可以分为基本访问控制列表和高级访问控制…

nodejs+springboot+elementui+python的Sd球鞋销售平台的设计与实现-毕业设计

此网站系统的开发方式和信息管理方式&#xff0c;借鉴前人设计的信息和研发。以网站商品信息为主&#xff0c;购物商品为核心功能来进行设计和研发&#xff0c;把网站信息和技术整合&#xff0c;开发出一套Sd球鞋销售平台。用目前现有的新技术进行系统开发&#xff0c;提供后台…

K-edge 和逃逸问题

一 k-eage基本概念 1 k-edge概念 K-edge称为K边, 其物理意义是高原子序数物质原子内部K层自由电子, 易与特定能量下X射线光子发生光电吸收作用, 导致对该能量的X射线光子吸收特别大。 而K-edge特性表现为X射线与物质发生相互作用时, 其衰减系数随着能量的增加而逐渐减小, 但在…

【优选算法系列】第一节.栈的简介(1047. 删除字符串中的所有相邻重复项和844. 比较含退格的字符串)

文章目录 前言一、删除字符串中的所有相邻重复项和 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写二、比较含退格的字符串 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写总结 前言 …

Vue组件化开发,组件的创建,注册,使用,详解Vue,vm,VueComponent,vc

组件化开发 模块是指将一个大的js文件按照模块化拆分规则进行拆分成的每个js文件, 凡是采用模块方式开发的应用都可以称为模块化应用(组件包括模块) 传统方式开发的一个网页通常包括三部分: 结构(HTML)、样式(CSS)、交互(JavaScript) 关系纵横交织复杂&#xff0c;牵一发动全…

4+m6A+机器学习+分型,要素过多,没有思路的同学可借鉴

今天给同学们分享一篇生信文章“Diagnostic, clustering, and immune cell infiltration analysis of m6A regulators in patients with sepsis”&#xff0c;这篇文章发表在Sci Rep.期刊上&#xff0c;影响因子为4.6。 结果解读&#xff1a; 脓毒症中m6A调节因子的转录改变 …

ChinaSoft 论坛巡礼 | 安全攸关软件的智能化开发方法论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

5.RDD持久化

概述 今日目标&#xff1a; RDD 持久化 RDD持久化原理RDD持久化策略如何选择RDD持久化策略案例 相关文章如下&#xff1a; spark官网地址RDD编程指南 RDD 持久化 RDD持久化原理 Spark中最重要的功能之一是跨操作在内存中持久化&#xff08;或缓存&#xff09;数据集。当…

Make.com实现多个APP应用的自动化的入门指南

Make.com是一款基于云的自动化平台&#xff0c;可帮助用户将多个应用程序连接在一起&#xff0c;并通过设置自动化流程来简化日常任务。Make.com提供丰富的API集成&#xff0c;支持连接各种流行的应用程序&#xff0c;包括社交媒体、电子商务、CRM等。 使用Make.com实现多个AP…

AM@点与点集的关系@n维空间邻域

文章目录 abstract坐标平面平面点集 平面邻域利用邻域描述点与点集的关系聚点点集分类 n n n维空间基础概念线性运算和空间概念 空间中的两点距离 n n n维空间中的变元极限 n n n维空间内的邻域 abstract 坐标平面和平面点集, n n n维空间点集点与点集的关系n维空间及其邻域 …

python用cv2画图(line, rectangle, text等)

Python做图像图形研究的时候&#xff0c;通常需要画很多辅助几何形状&#xff08;比如bounding box等&#xff09;。基于opencv的几何图形绘制具有易用性&#xff0c;而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法&#xff0c;当一个简易的手册使用&a…