用canvas制作彩虹球噴槍(js面向?qū)ο笮“咐?/h1>

前段時間在研究canvas详炬,感覺還挺好玩的嫡良,就寫了一個小demo袜炕,效果如下:

canvas.gif

第一次嘗試用js面向?qū)ο蟮姆绞絹韺懕久眨?jīng)驗不足,還請大家多多包涵偎窘。

下面開始簡單介紹代碼:

canvas畫布:

<canvas id='canvas' width='1050' height='500' style='background:#333;overflow: hidden;'></canvas>

彩虹球的隨機顏色是通過下面兩個方法來實現(xiàn)的乌助,在《js常用方法和一些封裝(2) -- 隨機數(shù)生成》中曾經(jīng)提到過溜在。

/**
 * 獲取 0 ~ num的隨機數(shù)(閉區(qū)間)
 */
function randomNum(num){
    return Math.floor(Math.random()*(num+1));
};

/**
 *  獲取隨機顏色(支持任意瀏覽器)
 */
function randomColor16(){
    //0-255 
    var r = randomNum(255).toString(16);
    var g = randomNum(255).toString(16);
    var b = randomNum(255).toString(16);
    //255的數(shù)字轉(zhuǎn)換成十六進制
    if(r.length<2)r = "0"+r;
    if(g.length<2)g = "0"+g;
    if(b.length<2)b = "0"+b;
    return "#"+r+g+b;
};
        

每當我鼠標點下,其實是在一個矩形區(qū)域隨機產(chǎn)生不同顏色的彩虹球他托,彩虹球出現(xiàn)的位置也是隨機的掖肋,通過范圍隨機數(shù)來實現(xiàn):

/*
 * 獲取范圍隨機數(shù) (閉區(qū)間)
 */
function randomRange(start,end){
    return Math.floor(Math.random()*(end-start+1))+start;
};

接下來是彩虹球的類,用面向?qū)ο髞碜觥?/p>

//彩虹球的類
var ColorBall = function(){}

ColorBall.prototype.left = 0; //X軸
ColorBall.prototype.top = 0;  //y軸
ColorBall.prototype.r = 10;   //半徑

在本案例中赏参,鼠標相當于是彩虹球噴槍志笼,我們也用面向?qū)ο蟮乃枷雭碓O(shè)計它:

//RainbowBrush 彩虹球噴槍
RainbowBrush = function(){}

//生產(chǎn)小球數(shù)組的方法
RainbowBrush.prototype.getBalls = function(num){
    var colorBalls = [];
    for(var i = 0; i < num; i++){
        var ball = new ColorBall();
        colorBalls.push(ball);
    }
    return colorBalls;
}

//噴刷彩虹球
RainbowBrush.prototype.brush = function(context,balls,x,y){
    balls.forEach(function(ballIem){
        ballIem.x = randomRange(x - 6,x + 6);
        ballIem.y = randomRange(y - 6,y + 6);
        ballIem.r = 5;
        
        context.beginPath();
        context.fillStyle=randomColor16();
        context.arc(ballIem.x,ballIem.y,ballIem.r,0,Math.PI*2);
        context.fill();
    })
    
}

它有兩個方法,一個是生產(chǎn)彩虹球把篓,另一個是噴刷彩虹球纫溃。

案例的主要邏輯如下:

var rainbowBrush = new RainbowBrush(); //初始化彩虹球噴槍
var balls = rainbowBrush.getBalls(1);

//當鼠標按下
canvasDom.onmousedown = function(){
    var flag = true;
    canvasDom.onmousemove = function(e){
        var x = e.clientX;
        var y = e.clientY;
        if(flag) rainbowBrush.brush(context,balls,x,y);
    }
    
    canvasDom.onmouseup = function(){
        flag = false;
    }
}

案例全部代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>彩虹球噴槍</title>
    </head>
    <body>
        <canvas id='canvas' width='1050' height='500' style='background:#333;overflow: hidden;'></canvas>
        
    </body>
    
    <script type="text/javascript">
    
        /**
         * 獲取 0 ~ num的隨機數(shù)(閉區(qū)間)
         */
        function randomNum(num){
            return Math.floor(Math.random()*(num+1));
        };

        /*
         * 獲取范圍隨機數(shù) (閉區(qū)間)
         */
        function randomRange(start,end){
            return Math.floor(Math.random()*(end-start+1))+start;
        };
        
        
        /**
         *  獲取隨機顏色(支持任意瀏覽器)
         */
        function randomColor16(){
            //0-255 
            var r = randomNum(255).toString(16);
            var g = randomNum(255).toString(16);
            var b = randomNum(255).toString(16);
            //255的數(shù)字轉(zhuǎn)換成十六進制
            if(r.length<2)r = "0"+r;
            if(g.length<2)g = "0"+g;
            if(b.length<2)b = "0"+b;
            return "#"+r+g+b;
        };
        
        var canvasDom = document.getElementById('canvas');
        var context = canvasDom.getContext('2d');
        var maxWidth = 1050;
        var maxHeight = 500;
        

        //彩虹球的類
        var ColorBall = function(){}
        
        ColorBall.prototype.left = 0; //X軸
        ColorBall.prototype.top = 0;  //y軸
        ColorBall.prototype.r = 10;   //半徑
        
        //RainbowBrush 彩虹球噴槍
        RainbowBrush = function(){}
        
        //生產(chǎn)小球數(shù)組的方法
        RainbowBrush.prototype.getBalls = function(num){
            var colorBalls = [];
            for(var i = 0; i < num; i++){
                var ball = new ColorBall();
                colorBalls.push(ball);
            }
            return colorBalls;
        }
        
        //噴刷彩虹球
        RainbowBrush.prototype.brush = function(context,balls,x,y){
            balls.forEach(function(ballIem){
                ballIem.x = randomRange(x - 6,x + 6);
                ballIem.y = randomRange(y - 6,y + 6);
                ballIem.r = 5;
                
                context.beginPath();
                context.fillStyle=randomColor16();
                context.arc(ballIem.x,ballIem.y,ballIem.r,0,Math.PI*2);
                context.fill();
            })
            
        }
        
        var rainbowBrush = new RainbowBrush(); //初始化彩虹球噴槍
        var balls = rainbowBrush.getBalls(1);

        //當鼠標按下
        canvasDom.onmousedown = function(){
            var flag = true;
            canvasDom.onmousemove = function(e){
                var x = e.clientX;
                var y = e.clientY;
                if(flag) rainbowBrush.brush(context,balls,x,y);
            }
            
            canvasDom.onmouseup = function(){
                flag = false;
            }
        }
        
        
        
    </script>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末,一起剝皮案震驚了整個濱河市韧掩,隨后出現(xiàn)的幾起案子紊浩,更是在濱河造成了極大的恐慌,老刑警劉巖疗锐,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坊谁,死亡現(xiàn)場離奇詭異,居然都是意外死亡滑臊,警方通過查閱死者的電腦和手機口芍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雇卷,“玉大人鬓椭,你說我怎么就攤上這事×郑” “怎么了膘融?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祭玉。 經(jīng)常有香客問我氧映,道長,這世上最難降的妖魔是什么脱货? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任岛都,我火速辦了婚禮,結(jié)果婚禮上振峻,老公的妹妹穿的比我還像新娘臼疫。我一直安慰自己,他們只是感情好扣孟,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布烫堤。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸽斟。 梳的紋絲不亂的頭發(fā)上拔创,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音富蓄,去河邊找鬼剩燥。 笑死,一個胖子當著我的面吹牛立倍,可吹牛的內(nèi)容都是我干的灭红。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼口注,長吁一口氣:“原來是場噩夢啊……” “哼变擒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起寝志,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赁项,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后澈段,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡舰攒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年败富,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摩窃。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡兽叮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猾愿,到底是詐尸還是另有隱情鹦聪,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布蒂秘,位于F島的核電站泽本,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏姻僧。R本人自食惡果不足惜规丽,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撇贺。 院中可真熱鬧赌莺,春花似錦、人聲如沸松嘶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巢音,卻和暖如春遵倦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背港谊。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工骇吭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人歧寺。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓燥狰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斜筐。 傳聞我的和親對象是個殘疾皇子龙致,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

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