美文网首页linux页面特效
Canvas<小球自由落体效果>

Canvas<小球自由落体效果>

作者: 誰在花里胡哨 | 来源:发表于2020-02-25 16:48 被阅读0次
效果图:
tantiao.gif

此效果参考他人代码,并加以注释和改造,想直接看源地址效果的话,可直接点击下方链接

参考地址:http://www.jq22.com/webqd6697

提供以下地址,方便你们理解和学习
1. canvas绘制圆
2. requestAnimationFrame更新动画
3. 清空画布

代码的注释我感觉已经很详细了,方便大家理解,这里就不说那么多废话了(本人之前有了解过canvas,接下来有机会,会从基础的知识点开始更新 😄)

代码如下:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }

    canvas {
        display: block;
    }
</style>

<body>
    <canvas id="canvas"></canvas>
</body>
<script>
    let w, h;                          // 定义一个窗口宽高的变量
    let ball_num = 1;                  //每次点击生成的小球个数
    let Gravity = 0.8;                 //小球下落速度 越小越慢
    let Firction = 0.9;                //小球弹跳力度 越大越高
    let ballArray = [];               //储存小球的数组

    //获取canvas标签
    let canvas = document.querySelector("#canvas")
    //创建画笔
    let ctx = canvas.getContext("2d");
    //小球颜色数组
    let colorArray = ["rgb(65, 105, 225)", "rgb(65, 166, 225)", "rgb(65, 214, 225)", "rgb(65, 225, 190)", "rgb(65, 225, 132)"];

    // 获取窗口大小方法
    function getWindow_size() {
        w = window.innerWidth;
        h = window.innerHeight;
        canvas.width = w;
        canvas.height = h;
    }


    // 随机生成一个 lower ~ upper 的整数
    function randomIntFronRange(lower, upper) {
        return Math.floor(Math.random() * (upper - lower)) + lower;
    };

    //创建小球的方法(主要是小球运动轨迹的绘制)
    function Ball(x, y, dx, dy, radius, color) {
        //此处并没有直接执行绘制动画,而是事先定义好相关属性值
        this.x = x;
        this.y = y;
        this.dy = dy
        this.dx = dx;
        this.radius = radius;
        this.color = color;

        //绘制一个圆球,并填充颜色
        // https://www.w3school.com.cn/tags/canvas_arc.asp

        this.draw = function () {
            ctx.beginPath();
            ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
            ctx.fillStyle = this.color;
            ctx.fill();
            ctx.closePath();
        }

        //实时更新动画
        this.update = function () {
            //y 轴临界值判断
            //如果小球在下降过程中到达底部时(及绘制小球的中心坐标位置超出窗口高度时)
            // alert(this.dy)  //不太清楚的可以 alert 一下
            if (this.y + this.radius + this.dy + Gravity > h) {
                //小球 y轴方向改变 (往上)
                this.dy = -this.dy;
                this.dy *= Firction;
                this.dx *= Firction;
            } else {
                //小球  y轴坐标递增 (往下)
                this.dy += Gravity;
            }
            //x 轴临界值判断
            if (this.x + this.radius + this.dx >= w || this.x - this.radius + this.dx <= 0) {
                //小球 x轴方向改变
                this.dx = -this.dx;
            }
            //小球 x,y坐标位置改变(因为之前的 dy,dx有取反过,所以此处会实现上下,左右的运动路线)
            this.y += this.dy;
            this.x += this.dx;
            //根据改变后的坐标位置绘图
            this.draw();
        }
    };

    //创建小球的方法(相关样式,起始坐标位置等)
    function init(m_x, m_y) {
        for (let i = 0; i < ball_num; i++) {
            let radius = randomIntFronRange(2, 10); //圆的半径
            // x,y 为绘制圆的中心坐标
            let x = m_x;
            let y = m_y;
            let dx = randomIntFronRange(-5, 5);//小球 x 轴位置 递增或者递减的一个随机值(小球是往左还是往右弹)
            let dy = randomIntFronRange(1, 2); //小球 y 轴位置 递增或者递减的一个随机值(小球上下弹动高度)
            let color = colorArray[Math.floor(Math.random() * colorArray.length)]; //从颜色数组里面随机取一个颜色
            ballArray.push(new Ball(x, y, dx, dy, radius, color)); //往小球数组里面添加每个小球的相关数值
        }
    };
   
   //执行动画方法
    function animation() {
        // 更新动画
        // https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame
        requestAnimationFrame(animation)
        //清除每个小球的运动痕迹
        ctx.clearRect(0, 0, w, h);
        for (let n of ballArray) {
            n.update();
        }
    };

    window.onload = function () {
        getWindow_size();
        //监听鼠标点击事件
        document.addEventListener("mousedown", function (event) {
            //清空画布
            // https://www.w3school.com.cn/tags/canvas_clearrect.asp
            ctx.clearRect(0, 0, w, h);
            //每次点击时获取鼠标位置,以鼠标位置生成小球
            init(event.clientX, event.clientY);
        });
        animation();
    }
</script>

</html>

相关文章

网友评论

    本文标题:Canvas<小球自由落体效果>

    本文链接:https://www.haomeiwen.com/subject/vatxchtx.html