zoukankan      html  css  js  c++  java
  • 面向对象+canvas 倒计时

      效果参照网上的,用面向对象改写了一下,只写了自己需要的部分。

    1、效果:

    实现:

    //html
    <canvas id="canvas" width="800px" height="500px"></canvas>
    
    //js
    ;(function(win, undefined) {
        function AtomCountdown(num) {
            this.WINDOW_WIDTH = 0; //可视
            this.WINDOW_HEIGHT = 0;
            this.RADIUS = 10; //小球半径
            this.numArr = [
                [
                    [0, 0, 1, 1, 1, 0, 0],
                    [0, 1, 1, 0, 1, 1, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 0, 1, 1, 0],
                    [0, 0, 1, 1, 1, 0, 0]
                ], //0
                [
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 1, 1, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [1, 1, 1, 1, 1, 1, 1]
                ], //1
                [
                    [0, 1, 1, 1, 1, 1, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 1, 1, 0, 0, 0],
                    [0, 1, 1, 0, 0, 0, 0],
                    [1, 1, 0, 0, 0, 0, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 1, 1, 1, 1, 1]
                ], //2
                [
                    [1, 1, 1, 1, 1, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 1, 1, 1, 0, 0],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 1, 1, 1, 0]
                ], //3
                [
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 1, 1, 1, 0],
                    [0, 0, 1, 1, 1, 1, 0],
                    [0, 1, 1, 0, 1, 1, 0],
                    [1, 1, 0, 0, 1, 1, 0],
                    [1, 1, 1, 1, 1, 1, 1],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 1, 1, 1, 1]
                ], //4
                [
                    [1, 1, 1, 1, 1, 1, 1],
                    [1, 1, 0, 0, 0, 0, 0],
                    [1, 1, 0, 0, 0, 0, 0],
                    [1, 1, 1, 1, 1, 1, 0],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 1, 1, 1, 0]
                ], //5
                [
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 1, 1, 0, 0, 0],
                    [0, 1, 1, 0, 0, 0, 0],
                    [1, 1, 0, 0, 0, 0, 0],
                    [1, 1, 0, 1, 1, 1, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 1, 1, 1, 0]
                ], //6
                [
                    [1, 1, 1, 1, 1, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 0, 1, 1, 0, 0, 0],
                    [0, 0, 1, 1, 0, 0, 0],
                    [0, 0, 1, 1, 0, 0, 0],
                    [0, 0, 1, 1, 0, 0, 0]
                ], //7
                [
                    [0, 1, 1, 1, 1, 1, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 1, 1, 1, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 1, 1, 1, 0]
                ], //8
                [
                    [0, 1, 1, 1, 1, 1, 0],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [1, 1, 0, 0, 0, 1, 1],
                    [0, 1, 1, 1, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 0, 1, 1],
                    [0, 0, 0, 0, 1, 1, 0],
                    [0, 0, 0, 1, 1, 0, 0],
                    [0, 1, 1, 0, 0, 0, 0]
                ] //9
            ];
            this.balls = [];
            this.colors = ["#CC9933", "#FF9900", "#AA66CC", "#9933CC", "#99CC00", "#669900", "#FFBB33"]; //小球颜色
            this.context = '';
            this.pos_left = 0;
            this.pos_top = 0;
            this.timer1 = null;
            this.timer2 = null;
            this.num = num; //倒计时 0-9
            this.init(); //初始化
        }
        AtomCountdown.prototype = {
            constructor: AtomCountdown,
            init: function() {
                this.WINDOW_WIDTH = document.documentElement.clientWidth;
                this.WINDOW_HEIGHT = document.documentElement.clientHeight;
    
                var canvas = document.getElementById('canvas');
                this.context = canvas.getContext("2d");
                this.pos_left = canvas.width / 2 - 100;
                this.pos_top = canvas.height / 2 - 100;
    
                var timer1 = setInterval(
                    function() {
                        this.render(this.context, this.pos_left, this.pos_top);
                        this.updateBalls();
                    }.bind(this), 100);
    
                var timer2 = setInterval(function() {
                    if (this.num >= 0) {
                        this.addBalls(this.pos_left, this.pos_top, this.num);
                        this.num--;
                    }
                    if (this.num < 0) {
                        clearInterval(timer2);
                        clearInterval(timer1);
                        this.closeAll();
                    }
                }.bind(this), 1000);
            },
            updateBalls: function() {
                for (var i = 0; i < this.balls.length; i++) {
    
                    this.balls[i].x += this.balls[i].vx;
    
                    var c = 1.0;
                    if (this.balls[i].y + this.RADIUS + this.balls[i].vy >= this.WINDOW_HEIGHT) {
                        c = (this.WINDOW_HEIGHT - (this.balls[i].y + this.RADIUS)) / this.balls[i].vy;
                    }
    
                    this.balls[i].y += this.balls[i].vy;
                    this.balls[i].vy += c * this.balls[i].g;;
    
                    if (this.balls[i].y >= this.WINDOW_HEIGHT - this.RADIUS) {
                        this.balls[i].y = this.WINDOW_HEIGHT - this.RADIUS;
                        this.balls[i].vy = -Math.abs(this.balls[i].vy);
                    }
                }
    
                var cnt = 0
                for (var i = 0; i < this.balls.length; i++) {
                    if (this.balls[i].x + this.RADIUS > 0 && this.balls[i].x - this.RADIUS < this.WINDOW_WIDTH) {
                        this.balls[cnt++] = this.balls[i];
                    }
                }
    
                while (this.balls.length > cnt) {
                    this.balls.pop();
                }
            },
            addBalls: function(x, y, num) {
                for (var i = 0; i < this.numArr[num].length; i++)
                    for (var j = 0; j < this.numArr[num][i].length; j++)
                        if (this.numArr[num][i][j] == 1) {
                            var aBall = {
                                x: x + j * 2 * this.RADIUS + this.RADIUS,
                                y: y + i * 2 * this.RADIUS + this.RADIUS,
                                g: 2 + Math.random(),
                                vx: Math.pow(-1, Math.ceil(Math.random() * 1000)) * 5,
                                vy: -10,
                                color: this.colors[Math.floor(Math.random() * this.colors.length)]
                            }
    
                            this.balls.push(aBall)
                        }
            },
            render: function(cxt, left, top) {
    
                cxt.clearRect(0, 0, this.WINDOW_WIDTH, this.WINDOW_HEIGHT);
    
                //num>=0时候,初始化数字
                this.num >= 0 && this.renderInit(this.pos_left, this.pos_top, this.num, this.context);
    
                //绘制爆炸的小球
                for (var i = 0; i < this.balls.length; i++) {
                    cxt.fillStyle = this.balls[i].color;
                    cxt.beginPath();
                    cxt.arc(this.balls[i].x, this.balls[i].y, this.RADIUS * 0.8, 0, 2 * Math.PI, true);
                    cxt.closePath();
    
                    cxt.fill();
                }
            },
            //绘制初始换的数字
            renderInit: function(x, y, num, cxt) {
                cxt.fillStyle = 'blue';
                for (var i = 0; i < this.numArr[num].length; i++)
                    for (var j = 0; j < this.numArr[num][i].length; j++)
                        if (this.numArr[num][i][j] == 1) {
                            cxt.beginPath();
                            cxt.arc(x + j * 2 * (this.RADIUS + 1) + (this.RADIUS + 1), y + i * 2 * (this.RADIUS + 1) + (this.RADIUS + 1), this.RADIUS, 0, 2 * Math.PI)
                            cxt.closePath()
                            cxt.fill()
                        }
            },
            closeAll: function() {
                this.context.clearRect(0, 0, this.WINDOW_WIDTH, this.WINDOW_HEIGHT);
            }
        }
        win.AtomCountdown = AtomCountdown;
    })(window)
    

      

    3、usage

    //实例  new AtomCountdown(9)
    

      

  • 相关阅读:
    大型高性能ASP.NET系统架构设计
    读写锁ReaderWriterLockSlim
    日常生活英语单词大全
    unity3d读取plist或xml文件
    WIN7开无线
    asp.net 2.0中新增的web.config的默认namespace功能 (转)
    面向对象的一些基本概念
    大话设计模式之策略模式
    大话设计模式之简单的工厂模式
    iOS UI 之UILable
  • 原文地址:https://www.cnblogs.com/leaf930814/p/6934713.html
Copyright © 2011-2022 走看看