在画布上绘制随机彩色圆圈

时间:2015-08-31 15:20:40

标签: javascript html5 cordova canvas

我正在尝试制作一个动画,其中圆圈从右向左运行。圆圈的颜色由功能随机选择。我创建了一个fiddle,其中一个圆圈从右到左运行。现在我的函数创建了一个随机颜色。此功能每秒执行一次,圆圈每秒更改一次颜色,而不是创建随机拾取颜色的新圆圈。如何更改它以便在画布上每秒绘制一个新圆圈并且不仅会更改圆圈的颜色?

这是我的功能:

<? php
$ date = date_create (YOUR_DATABASE_FIELD);
echo '<td><span style="display: none;">'. date_format ($ date, "Ymd"). '</span>'. date_format ($ date, "d-M-Y"). '</td>';

1 个答案:

答案 0 :(得分:1)

对您提问的评论:

您正在将每个帧的fillStyle颜色更改为随机颜色。这就是为什么它保持&#34;改变&#34;颜色。将其设置为圆的颜色:

context.fillStyle = circle.color;
  1. 使用数组
  2. 制作具有x,y,直径,弹力,速度和颜色的圆圈
  3. 使用requestAnimationFrame绘制并更新它们(我的是自定义函数)
  4. 我的回答:

    我昨晚做了这个,其中一些圆圈跟着光标和#34;反弹&#34;离开屏幕的边缘。我测试了代码并且它可以工作。

    我稍后可能会发布一个链接,但现在这里是所有代码......

    <!DOCTYPE html>
    <html>
    <body>
        <canvas id="canvas"></canvas>
        <script>
            var lastTime = 0;
            function requestMyAnimationFrame(callback, time)
            {
                var t = time || 16;
                var currTime = new Date().getTime();
                var timeToCall = Math.max(0, t - (currTime - lastTime));
                var id = window.setTimeout(function(){ callback(currTime + timeToCall); }, timeToCall);
                lastTime = currTime + timeToCall;
                return id;
            }
            var canvas = document.getElementById("canvas");
            var context = canvas.getContext("2d");
            canvas.width = window.innerWidth - 20;
            canvas.height = window.innerHeight - 20;
            canvas.style.width = canvas.width + "px";
            canvas.style.height = canvas.height + "px";
            var circles = [];
            var mouse =
            {
                x: 0,
                y: 0
            }
            function getCoordinates(x, y)
            {
                return "(" + x + ", " + y + ")";
            }
            function getRatio(n, d)
            {
                // prevent division by 0
                if (d === 0 || n === 0)
                {
                    return 0;
                }
                else
                {
                    return n/d;
                }
            }
            function Circle(x,y,d,b,s,c)
            {
                this.x = x;
                this.y = y;
                this.diameter = Math.round(d);
                this.radius = Math.round(d/2);
                this.bounciness = b;
                this.speed = s;
                this.color = c;
                this.deltaX = 0;
                this.deltaY = 0;
                this.drawnPosition = "";
                this.fill = function()
                {
                    context.beginPath();
                    context.arc(this.x+this.radius,this.y+this.radius,this.radius,0,Math.PI*2,false);
                    context.closePath();
                    context.fill();
                }
                this.clear = function()
                {
                    context.fillStyle = "#ffffff";
                    this.fill();
                }
                this.draw = function()
                {
                    if (this.drawnPosition !== getCoordinates(this.x, this.y))
                    {
                        context.fillStyle = this.color;
                        // if commented, the circle will be drawn if it is in the same position
                        //this.drawnPosition = getCoordinates(this.x, this.y);
                        this.fill();
                    }
                }
                this.keepInBounds = function()
                {
                    if (this.x < 0)
                    {
                        this.x = 0;
                        this.deltaX *= -1 * this.bounciness;
                    }
                    else if (this.x + this.diameter > canvas.width)
                    {
                        this.x = canvas.width - this.diameter;
                        this.deltaX *= -1 * this.bounciness;
                    }
                    if (this.y < 0)
                    {
                        this.y = 0;
                        this.deltaY *= -1 * this.bounciness;
                    }
                    else if (this.y+this.diameter > canvas.height)
                    {
                        this.y = canvas.height - this.diameter;
                        this.deltaY *= -1 * this.bounciness;
                    }
                }
                this.followMouse = function()
                {
                    // deltaX/deltaY will currently cause the circles to "orbit" around the cursor forever unless it hits a wall
                    var centerX = Math.round(this.x + this.radius);
                    var centerY = Math.round(this.y + this.radius);
                    if (centerX < mouse.x)
                    {
                        // circle is to the left of the mouse, so move the circle to the right
                        this.deltaX += this.speed;
                    }
                    else if (centerX > mouse.x)
                    {
                        // circle is to the right of the mouse, so move the circle to the left
                        this.deltaX -= this.speed;
                    }
                    else
                    {
                        //this.deltaX = 0;
                    }
                    if (centerY < mouse.y)
                    {
                        // circle is above the mouse, so move the circle downwards
                        this.deltaY += this.speed;
                    }
                    else if (centerY > mouse.y)
                    {
                        // circle is under the mouse, so move the circle upwards
                        this.deltaY -= this.speed;
                    }
                    else
                    {
                        //this.deltaY = 0;
                    }
                    this.x += this.deltaX;
                    this.y += this.deltaY;
                    this.x = Math.round(this.x);
                    this.y = Math.round(this.y);
                }
            }
            function getRandomDecimal(min, max)
            {
                return Math.random() * (max-min) + min;
            }
            function getRoundedNum(min, max)
            {
                return Math.round(getRandomDecimal(min, max));
            }
            function getRandomColor()
            {
                // array of three colors
                var colors = [];
                // go through loop and add three integers between 0 and 255 (min and max color values)
                for (var i = 0; i < 3; i++)
                {
                    colors[i] = getRoundedNum(0, 255);
                }
                // return rgb value (RED, GREEN, BLUE)
                return "rgb(" + colors[0] + "," + colors[1] + ", " + colors[2] + ")";
            }
            function createCircle(i)
            {
                // diameter of circle
                var minDiameter = 25;
                var maxDiameter = 50;
                // bounciness of circle (changes speed if it hits a wall)
                var minBounciness = 0.2;
                var maxBounciness = 0.65;
                // speed of circle (how fast it moves)
                var minSpeed = 0.3;
                var maxSpeed = 0.45;
                // getRoundedNum returns a random integer and getRandomDecimal returns a random decimal
                var x = getRoundedNum(0, canvas.width);
                var y = getRoundedNum(0, canvas.height);
                var d = getRoundedNum(minDiameter, maxDiameter);
                var c = getRandomColor();
                var b = getRandomDecimal(minBounciness, maxBounciness);
                var s = getRandomDecimal(minSpeed, maxSpeed);
                // create the circle with x, y, diameter, bounciness, speed, and color
                circles[i] = new Circle(x,y,d,b,s,c);
            }
            function makeCircles()
            {
                var maxCircles = getRoundedNum(2, 5);
                for (var i = 0; i < maxCircles; i++)
                {
                    createCircle(i);
                }
            }
            function drawCircles()
            {
                var ii = 0;
                for (var i = 0; ii < circles.length; i++)
                {
                    if (circles[i])
                    {
                        circles[i].draw();
                        ii++;
                    }
                }
            }
            function clearCircles()
            {
                var ii = 0;
                for (var i = 0; ii < circles.length; i++)
                {
                    if (circles[i])
                    {
                        circles[i].clear();
                        ii++;
                    }
                }
            }
            function updateCircles()
            {
                var ii = 0;
                for (var i = 0; ii < circles.length; i++)
                {
                    if (circles[i])
                    {
                        circles[i].keepInBounds();
                        circles[i].followMouse();
                        ii++;
                    }
                }
            }
            function update()
            {
                requestMyAnimationFrame(update,10);
                updateCircles();
            }
            function draw()
            {
                requestMyAnimationFrame(draw,1000/60);
                context.clearRect(0,0,canvas.width,canvas.height);
                drawCircles();
            }
            function handleError(e)
            {
                //e.preventDefault();
                //console.error("    ERROR    ------    " + e.message + "    ------    ERROR    ");
            }
            window.addEventListener("load", function()
            {
                window.addEventListener("error", function(e)
                {
                    handleError(e);
                });
                window.addEventListener("resize", function()
                {
                    canvas.width = window.innerWidth - 20;
                    canvas.height = window.innerHeight - 20;
                });
                window.addEventListener("mousemove", function(e)
                {
                    mouse.x = e.layerX || e.offsetX;
                    mouse.y = e.layerY || e.offsetY;
                });
                makeCircles();
                update();
                draw();
            });
        </script>
    </body>
    </html>