001e48a6创建于 2025年1月26日历史提交
<!DOCTYPE HTML>
<html>

<head>
    <title>sparks-sun</title>
    <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta charset="utf-8">
    <style type="text/css">
        body {
            font-family: Monospace;
            background-color: #f0f0f0;
            margin: 0px;
            overflow: hidden;
        }

        #container {
            width: 100%;
            height: 100%;
        }

        #testCanvas {
            background: #000;
        }
    </style>
</head>

<body>
    <div id="container">
        <canvas id="testCanvas"></canvas>
    </div>
    <script src="../../lib/requestAnimationFrame.min.js"></script>
    <script src="../../lib/stats.min.js"></script>
    <script src="../../lib/TweenLite.min.js"></script>
    <script src="//localhost:3001/build/proton.web.js"></script>
    <script>
        var canvas;
        var context;
        var proton;
        var renderer;
        var emitter;
        var stats;
        var mouseObj;
        var attractionForce;

        main();

        function main() {
            canvas = document.getElementById("testCanvas");
            canvas.width = window.innerWidth;
            canvas.height = window.innerHeight;

            addStats();
            loadImage();

            mouseObj = {
                x: canvas.width / 2,
                y: canvas.height / 2
            };

            resize();
        }

        function addStats() {
            stats = new Stats();
            stats.setMode(2);
            stats.domElement.style.position = 'absolute';
            stats.domElement.style.left = '0px';
            stats.domElement.style.top = '0px';
            document.body.appendChild(stats.domElement);
        }

        function loadImage() {
            var image = new Image()
            image.onload = function (e) {
                createProton(e.target);
                tick();
                canvas.addEventListener('mousedown', mouseDownHandler, false);
            }
            image.src = 'image/particle.png';
        }

        function createProton(image) {
            proton = new Proton;
            emitter = new Proton.Emitter();
            emitter.rate = new Proton.Rate(new Proton.Span(30, 50), .1);

            emitter.addInitialize(new Proton.Mass(1));
            emitter.addInitialize(new Proton.Body(image));
            //emitter.addInitialize(new Proton.P(new Proton.PointZone(canvas.width / 2, canvas.height / 2)));
            emitter.addInitialize(new Proton.Life(1, 1.7));
            emitter.addInitialize(new Proton.V(new Proton.Span(3, 5), new Proton.Span(0, 360), 'polar'));

            emitter.addBehaviour(new Proton.Color('#ff0000', '#ffff00'));
            attractionForce = new Proton.Attraction(mouseObj, 10, 200);
            emitter.addBehaviour(attractionForce);
            emitter.addBehaviour(new Proton.Scale(Proton.getSpan(1, 1.6), Proton.getSpan(0, .1)));
            emitter.addBehaviour(new Proton.Alpha(1, .2));

            emitter.p.x = canvas.width / 2;
            emitter.p.y = canvas.height / 2;
            emitter.emit();
            proton.addEmitter(emitter);

            renderer = new Proton.WebGLRenderer(canvas);
            renderer.blendFunc("SRC_ALPHA", "ONE");
            proton.addRenderer(renderer);
        }

        function resize() {
            window.onresize = function () {
                canvas.width = window.innerWidth;
                canvas.height = window.innerHeight;

                mouseObj.x = canvas.width / 2;
                mouseObj.y = canvas.height / 2;
                emitter.p.x = canvas.width / 2;
                emitter.p.y = canvas.height / 2;

                renderer.resize(canvas.width, canvas.height);
            }
        }

        function mouseDownHandler(e) {
            TweenLite.to(emitter.p, 1.5, {
                x: e.offsetX,
                y: e.offsetY,
            });

            TweenLite.to(mouseObj, 3.5, {
                x: e.offsetX,
                y: e.offsetY,
            });

            attractionForce.reset(mouseObj, 0, 200);
            setTimeout(function () { attractionForce.reset(mouseObj, 10, 200); }, 500);
        }

        function tick() {
            requestAnimationFrame(tick);

            stats.begin();

            if (proton) {
                proton.update();
                proton.stats.update(2, document.body);
            }

            stats.end();
        }
    </script>
</body>

</html>