导航

萌即是正义!时不时分享一些ACG活动记录与有趣代码的小站!

侧边栏
热门文章
1页面
程序员老黄历&求签
热度
455
2推文
一开始还以为是2.5次元的舞台剧,结果仔细一看是音乐剧!?有一丢丢的兴趣,到时候看看能不能搞到门票。 《FateZero》真人音乐剧 定妆照预告:https://www.bilibili.com/video/BV1RqSoYmEzJ
热度
207
3博文
探访《蜡笔小新》老家——春日部游记
热度
104
4博文
《孤独摇滚》圣地巡礼——下北泽&下北泽咖喱节2023
热度
91
5推文
知道这套道具的人年纪应该都不小了吧。
热度
78
6推文
刚发完对《冒险岛Online》R区的遗憾没多久,韩服那边又开始搞事情了,做出了如下的修改: 1、删除持有金币,主要消耗、其他道具; 2、可使用拍卖、个人件交易、金币市场功能; 3、装备卷轴强化和可用附加潜能,但是该效果在3个月内不生效,R区的终伤BUFF仍旧保存3个月; 4、删除R区被动中BOSS装备掉率增加属性等全部属性; 5、现有装备道具均变为永久不可交易道具。 ※主要删除道具:金币、红魔方、黑魔方、痕迹、强大火花、核心宝石、可获得装备的部分消耗道具、可通过金币购买的道具等。 这可真是至R区于死地啊...要说修改游戏的模式也就算了,现在不仅没有任何补充,还把先前的劳动成果给删除了是不是太过分了!? 日服到时候肯定二话不说跟进,国际服那边如果没了韩服对R区的技术支持,个人觉得服软也是时间的问题。
热度
52
7博文
谈谈这次《冒险岛Online》日服R区的削弱事件
热度
52
8推文
发现《爱上火车》的完全版仅售280日元就果断入了!虽然Lose解散了,但是留下了巨大的财富。
热度
52
9博文
记录第一次在日本进行携号转网(MNP)
热度
52
10博文
文石BOOX Leaf2使用感想
热度
52
最新评论
广树
2024-11-21 16:04
@hikari:BGM也许是吧,歌曲部分感觉不一定
hikari
2024-11-21 09:52
居然是音乐剧!真是没想到,难道说会用梶浦大妈的配乐吗?看预告片里就用的是fz里最扣人心弦的bgm。🥰
广树
2024-11-20 08:18
@石樱灯笼:这应该是受众的年龄层的问题吧
石樱灯笼
2024-11-20 06:57
@广树:承太郎抽根烟,整张嘴都被打码。
广树
2024-11-20 06:48
@石樱灯笼:不是挺符合人设吗?为什么会离谱?
正在攻略

logo_kai.jpg


PSN奖杯卡

PSN奖杯卡

赞助商广告

用canvas做 精灵 | 光点 | 粒子 | 光子 飘动的效果

作者:广树时间:2018-03-08 17:01:04分类:JavaScript/jQuery/Vue

前面做《四女神Online》模板的时候参照code pen上的一则飘雪效果改的。

首先引入HTML并想好canvas的ID:

<canvas id='canvasbg' class="star_effect"></canvas>

然后引入JS:

(function() {

    var Base, Particle, canvas, colors, context, drawables, i, mouseX, mouseY, mouseVX, mouseVY, rand, click, min, max, colors, particles, Cwidth, Cheight, GradientColors, CanvasEl;

    CanvasEl = "canvasbg"; //Canvas的ID
    min = 1; //最小光点直径
    max = 4; //最大光点直径
    particles = 200; //光点数量
    Cwidth = 800; //画布宽度
    Cheight = 600; //画布高度
    colors = ["255, 255, 255", "250, 150, 20", "255, 100, 255"]; //光点中间的颜色注意和晕开颜色顺序配对
    GradientColors = ["84,204,243", "250,150,20", "255, 100, 255"]; //光点晕开的颜色色注意和中间颜色顺序配对
    rand = function(a, b) {
        return Math.random() * (b - a) + a;
    };

    Particle = (function() {
        function Particle() {
            this.reset();
        }

        Particle.prototype.reset = function() {
            var colorSel = Math.random();
            this.color = colors[~~ (colorSel * colors.length)];
            this.GradientColors = GradientColors[~~ (colorSel * GradientColors.length)];
            this.radius = rand(min, max);
            this.x = rand(0, canvas.width);
            this.y = rand(60, canvas.height);
            this.vx = -5 + Math.random() * 10;
            this.vy = (Math.random() - 0.5) * this.radius;
            this.valpha = rand(0.02, 0.09);
            this.opacity = 0;
            this.life = 0;
            this.onupdate = undefined;
            this.type = "dust";
        };

        Particle.prototype.update = function() {
            this.x = (this.x + this.vx / 6);
            this.y = (this.y + this.vy / 6);

            if (this.opacity >= 1 && this.valpha > 0) this.valpha *= -1;
            this.opacity += this.valpha / 8;
            this.life += this.valpha / 8;

            if (this.type === "dust") this.opacity = Math.min(1, Math.max(0, this.opacity));
            else this.opacity = 1;

            if (this.onupdate) this.onupdate();
            if (this.life < 0 || this.radius <= 0 || this.y > canvas.height) {
                this.onupdate = undefined;
                this.reset();
            }
        };

        Particle.prototype.draw = function(c) {
            var grd = c.createRadialGradient(this.x, this.y, 0, this.x, this.y, this.radius * 4);
            grd.addColorStop(0, "rgba(" + this.GradientColors + ", " + Math.min(this.opacity - 0.2, 0.65) + ")");
            grd.addColorStop(1, "rgba(" + this.GradientColors + ", " + '0' + ")");
            c.fillStyle = grd;

            c.beginPath();
            c.arc(this.x, this.y, this.radius * 4, 2 * Math.PI, false);
            c.fill();

            c.strokeStyle = "rgba(" + this.color + ", " + Math.min(this.opacity, 0.85) + ")";
            c.fillStyle = "rgba(" + this.color + ", " + Math.min(this.opacity, 0.65) + ")";
            c.beginPath();
            c.arc(this.x, this.y, this.radius, 2 * Math.PI, false);
            c.fill();
        };

        return Particle;

    })();

    mouseVX = mouseVY = mouseX = mouseY = 0;

    canvas = document.getElementById(CanvasEl);
    context = canvas.getContext("2d");
    canvas.width = Cwidth;
    canvas.height = Cheight;

    drawables = (function() {
        var _i, _results;
        _results = [];
        for (i = _i = 1; _i <= particles; i = ++_i) {
            _results.push(new Particle);
        }
        return _results;
    })();

    function draw() {
        window.requestAnimFrame(draw);
        var d, _i, _len;
        canvas.width = Cwidth;
        canvas.height = Cheight;
        context.clearRect(0, 0, canvas.width, canvas.height)

        for (_i = 0, _len = drawables.length; _i < _len; _i++) {
            d = drawables[_i];
            d.draw(context);
        }
    };

    function update() {
        window.requestAnimFrame(update);
        var d, _i, _len, _results;
        _results = [];
        for (_i = 0, _len = drawables.length; _i < _len; _i++) {
            d = drawables[_i];
            _results.push(d.update());
        }
        return _results;
    };

    document.onmousemove = function(e) {
        mouseVX = mouseX;
        mouseVY = mouseY;
        mouseX = ~~e.pageX;
        mouseY = ~~e.pageY;
        mouseVX = ~~ ((mouseVX - mouseX) / 2);
        mouseVY = ~~ ((mouseVY - mouseY) / 2);

    };

    window.addEventListener('resize', draw, false);
    window.requestAnimFrame = (function() {
        return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame ||
        function(callback) {
            window.setTimeout(callback, 1000 / 60);
        };
    })();
    window.requestAnimFrame(draw);
    window.requestAnimFrame(update);
}).call(this);


可设置的参数有:
CanvasEl = "canvasbg";//Canvas的ID
min = 1;//最小光点直径
max = 4;//最大光点直径
particles = 200;//光点数量
Cwidth = 800;//画布宽度
Cheight = 600;//画布高度
colors = ["255, 255, 255","250, 150, 20","255, 100, 255"];//光点中间的颜色注意和晕开颜色顺序配对
GradientColors = ["84,204,243","250,150,20","255, 100, 255"];//光点晕开的颜色色注意和中间颜色顺序配对
注意:光点和光晕的顺序是配对的,比如第一个光点会搭配第一个光晕。






donate.png

1210 x 50(蓝底).png

cloudcone