用Canvas畫漫天繁星吧~

初學Canvas寫了一個在一片區域內隨機產生星星並且不斷閃動的效果。具體實現如下所示。
首先創建一個canvas讓其適配屏幕的大小。

    h = screen.height - 200;
    w = screen.width - 10;
    can1 = document.getElementById("canvas1");
    can1.setAttribute('width', w);
    can1.setAttribute('height', h);
    ctx1 = can1.getContext("2d");

然後創建一個遊戲循環gameLoop()方法,利用requestAnimationFrame()每幀調用該方法,首先繪製背景圖片,然後調用star.draw()方法繪製所有的星星。這裏還需要記錄一下每幀間隔的調用時間,爲了後面動畫更加平滑而使用。

  function gameLoop() {
    requestAnimationFrame(gameLoop);
    var now = Date.now();
    detaltime = now - lasttime  ;
    lasttime = now;

    ctx1.drawImage(bgPic, 0, 0, w, h);

    star.draw();

}

最後是star類的介紹,star類是管理所有星星繪製的類,每一顆星星都有三種狀態:暗、變亮、閃耀、變暗。這樣一個過程,下面是該類的代碼。

var starObj = function () {
    this.isMax = []; //是否完成變化
    this.time = []; //正在變化的時間
    this.x = [];    //x座標
    this.y = [];    //y座標
    this.life_time = []; //存活時間
    this.jianbain = [] ; //漸變時間
    this.star_pic = new Image();
    this.star2_pic = new Image();
}
starObj.prototype.num = 50;//星星數量

搞清楚了這三種狀態,下面就是星星出生的born()函數,開始時隨機產生10顆會變亮的星星,每顆星星擁有在2s~4s時間內的生命週期,並且開始計時。

starObj.prototype.born = function (i) {
        this.isMax[i] = false;
        this.time[i] = 0;
        this.x[i] = w/2 + Math.random() * 200 + i*10;
        this.y[i] = 20 + Math.random() * 200 + i*2;
        this.life_time[i] = (Math.random()*2 + 2) * 1000;
        this.jianbain[i] = 0;
}
starObj.prototype.suiji = function () {
    var sui = parseInt(Math.random()*49+1, 10); //0-49隨機數
    if(!this.isMax[sui]){
        this.isMax[sui] = true;
    }else{
        this.suiji();
    }

}

最後是星星的draw方法,該方法先判斷每顆星星的狀態,當它處於變亮狀態時,增加它的time值,同時結合前面提到的detaltime 值(刷幀時間間隔),更加平滑的改變星星的透明度從而使它變亮,當time值到達一定的時間點時,星星改變圖片,變成閃耀的狀態,接着不斷變暗並消失。當一個星星生命週期結束後,立即重置這個星星的值,相當於一顆新的星星。最後再次隨機長產生一個星星,來經歷這個生命週期。
因爲每個星星的週期都有所不同,這樣便產生了一個不斷閃爍的星空效果~再配上一個CSS3的動態表單,是不是感覺挺高大上的,哈哈~(不會傳動圖,先湊活看吧,有興趣可以再github下載源碼)
效果圖片
github地址:https://github.com/StringKun/LoginDemo

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章