吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2001|回复: 18
收起左侧

[学习记录] Canvas复刻李峋爱心代码

[复制链接]
waahah 发表于 2022-11-13 10:57
本帖最后由 waahah 于 2022-11-28 11:45 编辑
使用Javascript创建Canvas画板实现李峋同款爱心特效

核心思路及实现代码:

var context = canvas.getContext('2d'),
        particles = new ParticlePool(settings.particles.length),
        particleRate = settings.particles.length / settings.particles.duration, // particles/sec
        time;

    // get point on heart with -PI <= t <= PI
    function pointOnHeart(t) {
        return new Point(
            160 * Math.pow(Math.sin(t), 3),
            130 * Math.cos(t) - 50 * Math.cos(2 * t) - 20 * Math.cos(3 * t) - 10 * Math.cos(4 * t) + 25
        );
    }

    // creating the particle image using a dummy canvas
    var image = (function () {
        var canvas = document.createElement('canvas'),
            context = canvas.getContext('2d');
        canvas.width = settings.particles.size;
        canvas.height = settings.particles.size;
        // helper function to create the path
        function to(t) {
            var point = pointOnHeart(t);
            point.x = settings.particles.size / 2 + point.x * settings.particles.size / 350;
            point.y = settings.particles.size / 2 - point.y * settings.particles.size / 350;
            return point;
        }
        // create the path
        context.beginPath();
        var t = -Math.PI;
        var point = to(t);
        context.moveTo(point.x, point.y);
        while (t < Math.PI) {
            t += 0.01; // baby steps!
            point = to(t);
            context.lineTo(point.x, point.y);
        }
        context.closePath();
        // create the fill
        // context.fillStyle = '#c88ffe';
        context.fillStyle = '#ffc0cb';
        context.fill();
        // create the image
        var image = new Image();
        image.src = canvas.toDataURL();
        return image;
    })();

    // render that thing!
    function render() {
        // next animation frame
        requestAnimationFrame(render);

        // update time
        var newTime = new Date().getTime() / 1000,
            deltaTime = newTime - (time || newTime);
        time = newTime;

        // clear canvas
        context.clearRect(0, 0, canvas.width, canvas.height);

        // create new particles
        var amount = particleRate * deltaTime;
        for (var i = 0; i < amount; i++) {
            var pos = pointOnHeart(Math.PI - 2 * Math.PI * Math.random());
            var dir = pos.clone().length(settings.particles.velocity);
            particles.add(canvas.width / 2 + pos.x, canvas.height / 2 - pos.y, dir.x, -dir.y);
        }

        // update and draw particles
        particles.update(deltaTime);
        particles.draw(context, image);
    }

    // handle (re-)sizing of the canvas
    function onResize() {
        canvas.width = canvas.clientWidth;
        canvas.height = canvas.clientHeight;
    }
    window.onresize = onResize;

    // delay rendering bootstrap
    setTimeout(function () {
        onResize();
        render();
    }, 10);
})(document.getElementById('lovexf'));

运行图片展示

使用方法

双击打开文件夹中的H5.html即可启动看到画面

下载地址

https://wwt.lanzouy.com/io5tI0h3ehvi(lanzoul.com)

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
vowzhou + 1 + 1 谢谢@Thanks!
Patches + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

mmm8wwwwww 发表于 2022-11-13 13:06
哇塞,这也太帅了。李洵版本里面没字的吧?
Choco1987 发表于 2022-11-13 13:29
hkhkhk 发表于 2022-11-13 13:38
Patches 发表于 2022-11-13 14:53
点燃楼主 温暖坛友
leedyx1990 发表于 2022-11-13 15:03
这个必须点赞了
xiguadada 发表于 2022-11-13 16:49
这个必须点赞了
lizf2019 发表于 2022-11-13 18:06
有个建议:把那些要引用的放一个链接呗,下着也方便
 楼主| waahah 发表于 2022-11-13 20:27
lizf2019 发表于 2022-11-13 18:06
有个建议:把那些要引用的放一个链接呗,下着也方便

呜呜,我刚注册这个平台不知道怎么放一个链接~
D20 发表于 2022-11-28 09:48
下载好怎么用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表