小球不下落

来源:4-3 华丽的小球滚动效果

慕工程7433556

2017-04-22 16:11

var WINDOW_WIDTH = 1024;
var WINDOW_HEIGHT = 768;
var Radius = 8;
var MARGIN_TOP = 60;
var MARGIN_LEFT = 30;
//4月22日
const endTime = new Date(2017, 3, 22, 18, 00, 00);
var curShowTimeSeconds = 0;

var balls = [];
const colors = ["#33B5E5", "#CCC", "#caff67", "#67becf", "#ef3d61", "#f9f51a", "#a594c0", "#fa8ecc", "#f6ca29"];

window.onload = function () {
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");

    canvas.width = WINDOW_WIDTH;
    canvas.height = WINDOW_HEIGHT;

    curShowTimeSeconds = getCurrentShowTimeSeconds();
    setInterval(
        function () {
            render(context); //绘制
            update(); //改变
        },
        50
    );

}

function update() {
    var nextShowTimeSecondes = getCurrentShowTimeSeconds();

    var nexthours = parseInt(nextShowTimeSecondes / 3600);
    var nextminutes = parseInt((nextShowTimeSecondes - nexthours * 3600) / 60);
    var nextseconds = nextShowTimeSecondes % 60;

    var curhours = parseInt(curShowTimeSeconds / 3600);
    var curminutes = parseInt((curShowTimeSeconds - curhours * 3600) / 60);
    var curseconds = curShowTimeSeconds % 60;

    if (curseconds != nextseconds) {
        if (parseInt(curhours / 10) != parseInt(nexthours / 10)) {
            addBalls(MARGIN_LEFT, MARGIN_TOP, parseInt(curhours / 10))
        }

        if (parseInt(curhours % 10) != parseInt(nexthours % 10)) {
            addBalls(MARGIN_LEFT + 15 * (Radius + 1), MARGIN_TOP, parseInt(curhours % 10))
        }

        if (parseInt(curminutes / 10) != parseInt(nextminutes / 10)) {
            addBalls(MARGIN_LEFT + 39 * (Radius + 1), MARGIN_TOP, parseInt(curminutes / 10))
        }

        if (parseInt(curminutes % 10) != parseInt(nextminutes % 10)) {
            addBalls(MARGIN_LEFT + 54 * (Radius + 1), MARGIN_TOP, parseInt(curminutes % 10))
        }

        if (parseInt(curseconds / 10) != parseInt(nextseconds / 10)) {
            addBalls(MARGIN_LEFT + 78 * (Radius + 1), MARGIN_TOP, parseInt(curseconds / 10))
        }

        if (parseInt(curseconds % 10) != parseInt(nextseconds % 10)) {
            addBalls(MARGIN_LEFT + 93 * (Radius + 1), MARGIN_TOP, parseInt(nextseconds % 10))
        }

        curShowTimeSeconds = nextShowTimeSecondes;
    }

    updateBalls();
}

function updateBalls() {
    for (var i = 0; i < balls.length; i++) {
        balls[i].x += balls[i].vx;
        balls[i].y += balls[i].vy;
        balls[i].vy += balls[i].g;

        if (balls[i].y >= WINDOW_HEIGHT - Radius) {
            balls[i].y = WINDOW_HEIGHT - Radius;
            balls[i].vy = -balls[i].vy * 0.75;
        }
    }
}

function addBalls(x, y, num) {
    for (var i = 0; i < digit[num].length; i++)
        for (var j = 0; j < digit[num][i].length; j++)
            if (digit[num][i][j] == 1) {
                var aBall = {
                    x: x + j * 2 * (Radius + 1) + (Radius + 1),
                    y: y + i * 2 * (Radius + 1) + (Radius + 1),
                    g: 1.5 + Math.random,
                    vx: Math.pow(-1, Math.ceil(Math.random() * 1000)) * 4,
                    vy: -10,
                    color: colors[Math.floor(Math.random() * colors.length)]
                }
                balls.push(aBall);
            }
}

function getCurrentShowTimeSeconds() {
    var curTime = new Date();
    var ret = endTime.getTime() - curTime.getTime();
    ret = Math.round(ret / 1000); //得到秒数

    return ret >= 0 ? ret : 0;
}

function render(ctx) {
    ctx.clearRect(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
    var hours = parseInt(curShowTimeSeconds / 3600);
    var minutes = parseInt((curShowTimeSeconds - hours * 3600) / 60);
    var seconds = curShowTimeSeconds % 60;

    //数字占的宽带为(2*7+1)*(Radius+1),冒号占的宽带为(2*4+1)*(Radius+1)
    renderDigit(MARGIN_LEFT, MARGIN_TOP, parseInt(hours / 10), ctx);
    renderDigit(MARGIN_LEFT + 15 * (Radius + 1), MARGIN_TOP, parseInt(hours % 10), ctx);
    renderDigit(MARGIN_LEFT + 30 * (Radius + 1), MARGIN_TOP, 10, ctx);
    renderDigit(MARGIN_LEFT + 39 * (Radius + 1), MARGIN_TOP, parseInt(minutes / 10), ctx);
    renderDigit(MARGIN_LEFT + 54 * (Radius + 1), MARGIN_TOP, parseInt(minutes % 10), ctx);
    renderDigit(MARGIN_LEFT + 69 * (Radius + 1), MARGIN_TOP, 10, ctx);
    renderDigit(MARGIN_LEFT + 78 * (Radius + 1), MARGIN_TOP, parseInt(seconds / 10), ctx);
    renderDigit(MARGIN_LEFT + 93 * (Radius + 1), MARGIN_TOP, parseInt(seconds % 10), ctx);

    for (var i = 0; i < balls.length; i++) {
        ctx.fillStyle = balls[i].color;
        ctx.beginPath();
        ctx.arc(balls[i].x, balls[i].y, Radius, 0, 2 * Math.PI,true);
        ctx.closePath();
        ctx.fill();
    }
}

function renderDigit(x, y, num, ctx) {
    ctx.fillStyle = "rgb(0,102,153)";
    for (var i = 0; i < digit[num].length; i++)
        for (var j = 0; j < digit[num][i].length; j++)
            if (digit[num][i][j] == 1) {
                ctx.beginPath();
                ctx.arc(x + j * 2 * (Radius + 1) + (Radius + 1), y + i * 2 * (Radius + 1) + (Radius + 1), Radius, 0, 2 * Math.PI);
                ctx.closePath();
                ctx.fill();
            }
}


写回答 关注

1回答

  • 慕工程7433556
    2017-04-22 16:12:49

    http://img.mukewang.com/58fb10690001a42e14550469.jpg如上图

    MissOc...

    函数addBalls里面新创建的ball对象,g:1.5+Math.random(),少个括号

    2017-06-13 19:19:12

    共 1 条回复 >

炫丽的倒计时效果Canvas绘图与动画基础

学习HTML5中最激动人心的技术Canvas,彻底释放自己的创造力

96746 学习 · 1000 问题

查看课程

相似问题