iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Modern Web

JavaScript 嗨起來用 JS 做動畫 ε= ᕕ( ᐛ )ᕗ系列 第 5

Day05 - 讓輪子依隨機速度轉動並漸慢停下來

今天更新了輪子讓玩家點擊頁面時輪子會轉動,而轉速利用 Math.log(t) 達到先快後慢的漸慢效果

var Wheel = function (){
    this.t = 0;
    this.roll = false;
    this.level;
    this.stopLevel;
    this.update();
    this.render();
};

Wheel.prototype.rollToStop = function () {
    this.roll = !this.roll;

    // 時間記得歸零
    // render 轉速漸慢效果才能透過 ln(t) 讓轉速從高速的 t0 開始漸慢
    this.t = 0;

    // 轉速倍速為 5 ~ 10 的隨機數
    this.level = parseInt(Math.random() * 10) + 5 ;

    // 停止倍速為 3 ~ 6 的隨機數
    this.stopLevel = parseInt(Math.random() * 3) + 3 ;
    
    // 設定定時停止
    // 記得使用箭頭函數,確保 this 指向 wheel
    setTimeout(()=>{
        this.roll = false;
    },this.stopLevel * 1000)

    console.log('level:'+ this.level, 'stopLevel:'+ this.stopLevel) 
    
};

Wheel.prototype.update = function (){
    // 輪子轉的時候才更新轉動時間
    if (this.roll){
        this.t++;
    }
    setTimeout(()=>{this.update()});
}


Wheel.prototype.render = function (){
    // 鋪好畫布
    this.wheelCanvas = document.getElementById('wheelCanvas')
    this.ctx = this.wheelCanvas.getContext('2d');
    this.ww = this.wheelCanvas.width = window.innerWidth;
    this.wh = this.wheelCanvas.height = window.innerHeight;

    // 畫上背景底色
    this.ctx.fillStyle = '#faf7f8';
    this.ctx.fillRect(0, 0, this.ww, this.wh);

    // 畫上圓形輪子
    this.ctx.fillStyle = '#fcd2dc';
    this.ctx.arc(this.ww/2 , this.wh/2, 300, 0, Math.PI * 2);
    this.ctx.fill();

    this.ctx.save();
        // 將初始座標 this.ww/2 , this.wh/2 設為新座標 0,0 的所在地 
        this.ctx.translate(this.ww/2 , this.wh/2);

        // 座標軸依照時間旋轉
        // 透過將時間取 ln 達到轉速漸慢效果
        // 透過乘上我們自訂的整數讓旋轉力道加大
        this.ctx.rotate(Math.log(this.t)*this.level);

        // 畫六分之一個圓
        this.ctx.beginPath();
            // 記得要移動到等等要畫的圓心
            this.ctx.moveTo(0,0)
            this.ctx.arc(0, 0, 300, 0, Math.PI * 2 / 6);
            this.ctx.fillStyle = '#1460db';
            this.ctx.fill();
        this.ctx.closePath();
        
        // 畫六分之一個圓
        this.ctx.beginPath();
            // 記得要移動到等等要畫的圓心
            this.ctx.moveTo(0,0)
            this.ctx.arc(0, 0, 300, Math.PI * 2 / 6, Math.PI * 2 / 6 * 2);
            this.ctx.fillStyle = '#f72d5c';
            this.ctx.fill();
        this.ctx.closePath();
    this.ctx.restore();
    requestAnimationFrame(()=>this.render());
};


var wheel = new Wheel();

wheelCanvas.addEventListener('click', function(){
    wheel.rollToStop();
})

看輪子轉看得頭有點暈,如果內容有誤或有其他做法,希望路過的俠客能多多提點了 ε= ᕕ( ᐛ )ᕗ


上一篇
Day04 - 微調讓昨天的輪盤轉起來
下一篇
Day06 - 學習 Class
系列文
JavaScript 嗨起來用 JS 做動畫 ε= ᕕ( ᐛ )ᕗ17

尚未有邦友留言

立即登入留言