smoke.js| 一個小而簡單的煙霧效果

實現(xiàn)一個小而簡單的煙霧效果葵袭。
引入一個 smoke.js 的插件,就可以開始玩煙霧了依痊。
最后面有插件的源代碼

Smoke.js的使用文檔

smokemachine(ctx曲秉,[r顷霹,g,b])
//[r跳夭,g涂圆,b] - (可選)我們想要的煙的顏色

party.start()//開始動畫们镜!

party.stop()//停止動畫

party.addsmoke(X币叹,Y,numberofparticles)

x模狭,y - 應(yīng)在畫布中創(chuàng)建煙霧的坐標 ,   數(shù)量多 - 更多的煙霧

party.step(毫秒)//重新點燃煙霧

畫煙霧

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <style type="text/css">
//給canvas弄上一些效果
      html, body {
          position: absolute;
          margin: 0;
          width: 100%;
      }
      #hi{
        position: absolute;
        top: 40%;
        width: 100%;
        text-align: center;
      }
      #hi a {
        color: #fff;
        font-size: 80px;
        text-decoration: none;      
        font-family: Lobster;
      }
    </style>
    <body>
        <canvas id="canvas"></canvas>
    </body>
//根據(jù)自己的文件路徑引入插件
    <script src="js/smoke.js"></script>
    <script type="text/javascript">
    var canvas = document.getElementById('canvas')
    var ctx = canvas.getContext('2d')
//設(shè)置畫布寬高    
        canvas.width = innerWidth;
    canvas.height = innerHeight;

    var party = smokemachine(ctx, [54, 16.8, 18.2])
    party.start() //開始動畫

    onmousemove = function (e) {
        var x = e.clientX;
        var y = e.clientY;
        var n = .5;
        var t = Math.floor(Math.random() * 200) + 3800;
        party.addsmoke(x, y, n, t)
    }

    setInterval(function(){
        party.addsmoke(innerWidth/2, innerHeight, 1)
    }, 100)
    </script>
</html>

Somke.js 的源代碼

var smokemachine = function (context, color){
    color = color || [24, 46.8, 48.2]
    var polyfillAnimFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
                                  window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;
    var lastframe;
    var currentparticles = []
    var pendingparticles = []

    var buffer = document.createElement('canvas'),
        bctx = buffer.getContext('2d')

    buffer.width = 20
    buffer.height = 20

    var opacities = [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,3,5,5,7,4,4,1,1,0,1,0,0,0,0,0,1,0,0,17,27,41,52,56,34,23,15,11,4,9,5,1,0,0,0,0,0,0,1,45,63,57,45,78,66,52,41,34,37,23,20,0,1,0,0,0,0,1,43,62,66,64,67,115,112,114,56,58,47,33,18,12,10,0,0,0,0,39,50,63,76,87,107,105,112,128,104,69,64,29,18,21,15,0,0,0,7,42,52,85,91,103,126,153,128,124,82,57,52,52,24,1,0,0,0,2,17,41,67,84,100,122,136,159,127,78,69,60,50,47,25,7,1,0,0,0,34,33,66,82,113,138,149,168,175,82,142,133,70,62,41,25,6,0,0,0,18,39,55,113,111,137,141,139,141,128,102,130,90,96,65,37,0,0,0,2,15,27,71,104,129,129,158,140,154,146,150,131,92,100,67,26,3,0,0,0,0,46,73,104,124,145,135,122,107,120,122,101,98,96,35,38,7,2,0,0,0,50,58,91,124,127,139,118,121,177,156,88,90,88,28,43,3,0,0,0,0,30,62,68,91,83,117,89,139,139,99,105,77,32,1,1,0,0,0,0,0,16,21,8,45,101,125,118,87,110,86,64,39,0,0,0,0,0,0,0,0,0,1,28,79,79,117,122,88,84,54,46,11,0,0,0,0,0,0,0,0,0,1,0,6,55,61,68,71,30,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,23,25,20,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,12,9,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,2,0,0,0,0,0,0,0,0]

    var data = bctx.createImageData(20,20)
    var d = data.data

    for(var i=0;i<d.length;i+=4){
        d[i]=color[0]
        d[i+1]=color[1]
        d[i+2]=color[2]
        d[i+3]=opacities[i / 4]
    }

    bctx.putImageData(data,0,0)

    var imagewidth = 20 * 5
    var imageheight = 20 * 5

    function particle(x,y,l){
        this.x = x
        this.y = y
        this.age = 0
        this.vx = (Math.random()*8-4)/100
        this.startvy = -(Math.random()*30+10)/100
        this.vy = this.startvy
        this.scale = Math.random()*.5
        this.lifetime = Math.random()*l+l/2
        this.finalscale = 5+this.scale+Math.random()

        this.update = function(deltatime){
            this.x+=this.vx*deltatime
            this.y+=this.vy*deltatime
            var frac = Math.pow((this.age)/this.lifetime,.5)
            this.vy = (1-frac)*this.startvy
            this.age+=deltatime
            this.scale=frac*this.finalscale
        }

        this.draw = function(){
            context.globalAlpha = (1-Math.abs(1-2*(this.age)/this.lifetime))/8
            var off = this.scale*imagewidth/2
            var xmin = this.x-off
            var xmax = xmin+this.scale*imageheight
            var ymin = this.y-off
            var ymax = ymin+this.scale*imageheight
            context.drawImage(buffer, xmin, ymin, xmax-xmin, ymax-ymin)
        }
    }


    function addparticles(x,y,n,lifetime){
        lifetime = lifetime || 4000
        n = n || 10
        if(n < 1) return Math.random() <= n && pendingparticles.push(new particle(x,y,lifetime));
        for (var i = 0; i < n; i++) {
            pendingparticles.push(new particle(x,y,lifetime))
        };
    }

    function updateanddrawparticles(deltatime){
        context.clearRect(0, 0, context.canvas.width, context.canvas.height);   
        deltatime = deltatime || 16
        var newparticles = []
        currentparticles = currentparticles.concat(pendingparticles)
        pendingparticles = []

        currentparticles.forEach(function(p){
            p.update(deltatime)
            if (p.age<p.lifetime){
                p.draw()
                newparticles.push(p)
            }
        })
        currentparticles = newparticles
    }

    function frame(time){
        if(running){
            var deltat = time-lastframe
            lastframe = time;

            updateanddrawparticles(deltat)

            polyfillAnimFrame(frame)
        }
    }

    var running = false
    function start(){
        running = true
        polyfillAnimFrame(function(time){
            lastframe = time
            polyfillAnimFrame(frame)
        })
    }

    function stop(){
        running = false
    }

    return {
        start:start,
        stop:stop,
        step: updateanddrawparticles,
        addsmoke: addparticles
    }

}

弄完之后就可以在網(wǎng)頁上颈抚,隨著鼠標的移動,煙霧就生成了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚼鹉,一起剝皮案震驚了整個濱河市贩汉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锚赤,老刑警劉巖匹舞,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異线脚,居然都是意外死亡赐稽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門浑侥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姊舵,“玉大人,你說我怎么就攤上這事寓落±ǘ。” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵伶选,是天一觀的道長史飞。 經(jīng)常有香客問我尖昏,道長,這世上最難降的妖魔是什么构资? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任会宪,我火速辦了婚禮,結(jié)果婚禮上蚯窥,老公的妹妹穿的比我還像新娘掸鹅。我一直安慰自己,他們只是感情好拦赠,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布巍沙。 她就那樣靜靜地躺著,像睡著了一般荷鼠。 火紅的嫁衣襯著肌膚如雪句携。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天允乐,我揣著相機與錄音矮嫉,去河邊找鬼。 笑死牍疏,一個胖子當著我的面吹牛蠢笋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鳞陨,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼昨寞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厦滤?” 一聲冷哼從身側(cè)響起援岩,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掏导,沒想到半個月后享怀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡趟咆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年添瓷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忍啸。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡仰坦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出计雌,到底是詐尸還是另有隱情悄晃,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站妈橄,受9級特大地震影響庶近,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眷蚓,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一鼻种、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沙热,春花似錦叉钥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爵川,卻和暖如春敷鸦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寝贡。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工扒披, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人圃泡。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓碟案,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洞焙。 傳聞我的和親對象是個殘疾皇子蟆淀,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,110評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件澡匪、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,102評論 4 62
  • 5.3號早上6.50鬧鈴響起,我睜開眼睛發(fā)現(xiàn)我的同學(xué)在走廊里吵鬧褒链,因為我們今天要出去寫生了唁情,收拾好行李,出門了甫匹,一...
    小場面閱讀 223評論 0 0
  • 時間是否會改變一切甸鸟,原諒我,對你的猜疑…… 假如真有那么一次見面的機會兵迅,我會把我內(nèi)心里的話說出來抢韭,至少我不想有壓抑...
    aha參茸滋補鹿副業(yè)閱讀 217評論 0 0
  • 風有些大啊,幸好我出門加了件風衣恍箭。 風不大刻恭,這點風怎么能算大呢?沙塵暴卷起的風比它沉重的多,冰雪暴砸在臉上的冰球比...
    鬼紋閱讀 178評論 0 0