1. 程式人生 > >HTML5的Canvas實現小圓點在螢幕內跑動

HTML5的Canvas實現小圓點在螢幕內跑動

點選螢幕可以增加小圓點個數,效果如圖:

完整程式碼如下,複製到HTML檔案,開啟即可執行。

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title id="title">Hover</title>       
        <!-- <link href="css/css.css" rel="stylesheet"> -->
        <style>
            /*@import url(http://fonts.googleapis.com/css?family=Righteous);*/
            body {
              width: 100%;
              margin: 0;
              overflow: hidden;
              cursor: move;
              background: black;
              height: 100%;
            }
        </style>
    </head>
    <body>
        <canvas id='canvas'></canvas>

        <script>
            window.requestAnimFrame = (function() {
                return window.requestAnimationFrame ||
                    window.webkitRequestAnimationFrame ||
                    window.mozRequestAnimationFrame ||
                    window.oRequestAnimationFrame ||
                    window.msRequestAnimationFrame ||
                    function(callback) {
                        window.setTimeout(callback, 1000 / 60);
                    };
            }) ();

            c = document.getElementById('canvas'),
            $ = c.getContext('2d');

            //設定畫布的寬高
            var w = c.width = window.innerWidth;
            var h = c.height = window.innerHeight;

            //噴射點座標
            sx = w / 2;
            sy = h / 2;

            //放置圓點物件的陣列
            var circles = [];

            //滑鼠的位置
            var mouse = {
                x: 0,
                y: 0
            };

            //初始速度
            var vel = 10;

            //建立新的圓點並加入陣列
            function createCircle() {
                circles.push({
                    x: sx,
                    y: sy,
                    v: {
                        x: vel * Math.random(),
                        y: vel * Math.random()
                    }
                });
            }

            //清除畫布內容
            function clear() {
                $.fillStyle = 'black';
                $.fillRect(0,0,w,h);
            }

            //畫圓點
            function drawCircle() {
                clear();

                for (var i in circles) {
                    if (circles[i].x < 5 || w - circles[i].x < 5) {
                        circles[i].v.x *= -1;
                        circles[i].v.y -= 1;
                    }
                    if (circles[i].y < 5 || h - circles[i].y < 5) {
                        circles[i].v.y *= -1;
                        circles[i].v.x -= 1;
                    }

                    circles[i].x += circles[i].v.x;
                    circles[i].y += circles[i].v.y;

                    $.fillStyle = 'red';
                    $.beginPath();
                    $.arc(circles[i].x, circles[i].y, 20, 0, Math.PI * 2, true);
                    $.closePath();
                    $.fill();
                }
            }

            //設定動畫的回撥函式,使動畫持續播放
            function updateCanvas() {
                requestAnimationFrame(updateCanvas),
                drawCircle();
            }

            window.addEventListener('mousedown',createCircle);

            //頁面載入後自行產生一個圓點
            createCircle();

            //觸發迴圈回撥,動畫即可持續進行
            updateCanvas();
        </script>
    </body>
</html>