Cooldown without canvas

100°³ÀÇ Äð´Ù¿î Áß¿¡ ½ºÅ¬·Ñ Çؼ­ 10°³¸¸ Ç×»ó º¸ÀÎ´Ù°í °¡Á¤ ÇßÀ»¶§ 10°³ÀÇ Äµ¹ö½º¸¸ ±×¸®´Â°ÍÀÌ ÁÁÀ»°ÍÀÌ´Ù.

³ª¸ÓÁö 90°³ÀÇ Äð´Ù¿î ¿ÀºêÁ§Æ®´Â ½Ã°£Àº ÁøÇàÇÏ°í ĵ¹ö½º´Â ¾ø´Â °ÍÀÌ ¼º´É ¸é¿¡¼­ ÁÁÀ» °ÍÀÌ´Ù.

Cooldown »ç¿ë¹ý

1. ¿ÀºêÁ§Æ® »ý¼º : »ý¼º½Ã ÁÖ´Â ÀÎÀÚ´Â durationÀ¸·Î Ãʸ¦ ³ªÅ¸³½´Ù.

var cooldown1 = new Cooldown(30);

2. setCanvas : ĵ¹ö½º¸¦ ¼³Á¤ÇÏÁö ¾ÊÀ¸¸é ·»´õ¸µÀ» ÇÏÁö ¾Ê´Â´Ù.

cooldown1.setCanvas('myCanvas');

3. unlinkCanvas :  ĵ¹ö½º¸¦ ÇØÁ¦ ÇÑ´Ù.

cooldown1.unlinkCanvas();

4. play : ½Ã°£À» ÁøÇà½ÃŲ´Ù.

cooldown1.play( );

5. resetAnimation :  ½Ã°£À» Àç ¼³Á¤ÇÑ´Ù.
                           ù¹ø° ÀÎÀÚ´Â ÁøÇàµÈ ½Ã°£, µÎ¹ø° ÀÎÀÚ´Â durationÀÌ´Ù.

cooldown1.resetAnimation(5, 10);

»ç¿ë ¿¹

3°³ÀÇ Äµ¹ö½º°¡ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ.

myCanvas
myCanvas1
myCanvas2

Cooldown ¿ÀºêÁ§Æ®´Â 5°³¸¦ ´ÙÀ½°ú °°ÀÌ ¸¸µç´Ù.

var cooldown1 = new Cooldown(30);
cooldown1.setCanvas('myCanvas');
cooldown1.addNormalShadow();

var cooldown2 = new Cooldown(20);
cooldown2.setCanvas('myCanvas1');

var cooldown3 = new Cooldown(10);
cooldown3.setCanvas('myCanvas2');

var cooldown4 = new Cooldown(50);
var cooldown5 = new Cooldown(50);
cooldown4.play();
cooldown5.play();

cooldown4, cooldown5´Â ĵ¹ö½º°¡ ¾ø´Â Cooldown ¿ÀºêÁ§Æ®·Î ½ÇÇàÁï½Ã Ç÷¹ÀÌ ÇÑ´Ù.

ÀÚ¹Ù½ºÅ©¸³Æ® Àüü ÄÚµå

function Cooldown(duration) {
    var canvas;
    var timer = null;
    var lastTime;
    var accumulatedTime = 0;
    var remainedTime = 0;
    const frameTime = 0.03333;
    var radius = 100;
    var endTime = duration;
    var isLoop = false;
   
    this.setCanvas = function(elementName) {
        if(elementName === undefined) {
            canvas = undefined;
        }
        else {
            canvas = document.getElementById(elementName);
            initCanvas();
        }
    }
   
    this.setDuration = function(time) {
        endTime = time;
    }
   
    this.resetAnimation = function(useTime, goalTime) {
        accumulatedTime = useTime;
        endTime = goalTime;
        remainedTime = 0;   
        lastTime = getTime();
       
        if(accumulatedTime < endTime) {
            var degree = 360*accumulatedTime/endTime;
            this.render(degree);
        }
       
        if(isLoop === false) {
            isLoop = true;
            this.onFrameCooldown();
        }
    }
   
    this.addNormalShadow = function() {
        if(canvas === undefined)
            return;
        if(canvas.classList.contains("select-shadow"))
            canvas.classList.remove("select-shadow");
        canvas.classList.add('normal-shadow');
    }
   
    this.addSelectShadow = function() {
        if(canvas.classList.contains("normal-shadow"))
            canvas.classList.remove("normal-shadow");   
        canvas.classList.add('select-shadow');
    }   
   
    this.render = function(degree) {
        if(canvas === undefined)
            return;
        var digits = 6;
        var radian = degree * Math.pi/180;
        var ctx = canvas.getContext('2d');
       
        ctx.setTransform(1, 0, 0, 1, 0, 0);
        ctx.clearRect(0, 0, canvas.width, canvas.height);       
       
        ctx.lineWidth = 3; 
        ctx.fillStyle = 'rgba(200,100,100,0.6)';
        ctx.strokeStyle = 'rgba(200,100,100,0.3)';
       
        ctx.translate(canvas.width/2, canvas.height/2);
        ctx.rotate(-Math.PI/2);     
       
        ctx.beginPath();
        ctx.moveTo(0, 0);
        ctx.lineTo( radius * Math.cos(0).toFixed(digits), radius * Math.sin(0).toFixed(digits));  
        ctx.moveTo(0, 0);
        ctx.lineTo( radius * Math.cos(radian).toFixed(digits), radius * Math.sin(radian).toFixed(digits));
        ctx.arc(0, 0, radius, degree * Math.PI/180, Math.PI*2, false);
        ctx.stroke();
        ctx.fill();
        ctx.closePath();          
    }
   
    this.clearCanvas = function() {
        if(canvas === undefined)
            return;
        var ctx = canvas.getContext('2d');
        ctx.setTransform(1, 0, 0, 1, 0, 0);
        ctx.clearRect(0, 0, canvas.width, canvas.height);
    }
   
    this.endCooldown = function() {
        this.clearCanvas();
        if(timer)
            clearTimeout(timer);
        timer = null; 
        isLoop = false;
    }
   
    this.unlinkCanvas = function() {
        this.endCooldown();
        this.setCanvas(undefined);
    }

    var getTime = function() { return new Date().getTime(); }   
   
    var initCanvas = function() {
        if(canvas) {
            canvas.width = canvas.offsetWidth;
            canvas.height = canvas.offsetHeight;
            radius = Math.sqrt(Math.pow(canvas.clientWidth, 2) + Math.pow(canvas.clientHeight, 2));     
        }   
    }
   
    var count = 0;
    this.onFrameCooldown  = function() {
        console.log("onFrameCooldown   " + String(count));
        count++;
   
        var self = this;
        if (!timer)
            return;
           
        var now = getTime();
        var repeat = this.updateCooldown((now - lastTime)/1000.0);      
        if(repeat === false || isLoop === false) {
            this.clearCanvas();
            isLoop = false;
            return;
        }
        lastTime = now;
        requestAnimationFrame(function() {
            self.onFrameCooldown();
        });
    }
   
    this.updateCooldown = function(deltaTime) {
        remainedTime = remainedTime + deltaTime;
        accumulatedTime += deltaTime;
        if (remainedTime > frameTime) {      
            remainedTime -= frameTime;
            var degree = 360*accumulatedTime/endTime;  
           
            var repeat = true;
            if(degree > 360) {
                degree = 360;
                repeat = false;
            }
            this.render(degree);
            return repeat;
        }
    } 
   
    this.initCooldown = function() {
        if (!timer) {
            initCanvas();
            isLoop = true;
            var self = this;
            timer = setTimeout(function() { self.endCooldown }, endTime*1000);
           
            lastTime = getTime();
            this.render(0);
            this.onFrameCooldown();
        }       
    }   
      
    this.play = function() {
        if (!timer)
            this.initCooldown();
    }       
};

document.addEventListener("keydown", onKeyDown);

var cooldown1 = new Cooldown(30);
cooldown1.setCanvas('myCanvas');
cooldown1.addNormalShadow();

var cooldown2 = new Cooldown(20);
cooldown2.setCanvas('myCanvas1');

var cooldown3 = new Cooldown(10);
cooldown3.setCanvas('myCanvas2');

var cooldown4 = new Cooldown(50);
var cooldown5 = new Cooldown(50);
cooldown4.play();
cooldown5.play();
       
function onKeyDown(e) {
    if(e.keyCode === '1'.charCodeAt(0)) {
        cooldown1.addSelectShadow();
        cooldown1.play();
    }
    else if(e.keyCode === '2'.charCodeAt(0)) {
        cooldown2.addSelectShadow();
        cooldown2.play();
    }
    else if(e.keyCode === '3'.charCodeAt(0)) {
        cooldown3.addSelectShadow();
        cooldown3.play();
    }
    else if(e.keyCode === '4'.charCodeAt(0)) {
        cooldown1.resetAnimation(5, 10);
        cooldown1.play();
    }   
    else if(e.keyCode === '9'.charCodeAt(0)) {
        cooldown1.unlinkCanvas();
        cooldown2.unlinkCanvas();   
   
        cooldown4.setCanvas('myCanvas');
        cooldown5.setCanvas('myCanvas1');
    }       
    else if(e.keyCode === '0'.charCodeAt(0)) {  
        cooldown1.unlinkCanvas();
        cooldown2.unlinkCanvas();
    }   
}

Å°º¸µå '1', '2', '3', '4', '9', '0' ¸í·É¾î·Î Å×½ºÆ® ÇÒ¼ö ÀÖ´Ù.

½ÃÀÛÇϸé 1, 2, 3, 4 ±îÁö Â÷·Ê´ë·Î ´­·¯º»´Ù.
9¸¦ ´©¸£¸é cooldown1, cooldown2 ĵ¹ö½º¸¦ ÇØÁ¦ÇÏ°í cooldown4, cooldown5 ĵ¹ö½º¸¦ ¼³Á¤ÇÑ´Ù.

Å×½ºÆ® ÆÄÀÏ : test06.html