首頁 >web前端 >js教程 >canvas動態小球重疊效果

canvas動態小球重疊效果

高洛峰
高洛峰原創
2017-02-09 17:16:491267瀏覽

前面的話

  在javascript運動系列中,詳細介紹了各種運動,其中就包括碰壁運動。但是,如果用canvas去實現,卻是另一種思路。本文將詳細介紹canvas動態小球重疊效果

靜態小球

  首先,生成隨機半徑、隨機位置的50個靜態小球

<button id="btn">按钮</button><canvas id="canvas" width="500" height="300" style="border:1px solid black">当前浏览器不支持canvas,请更换浏览器后再试</canvas><script>var canvas = document.getElementById('canvas');var H=300,W=500;
btn.onclick = function(){
    getBalls();
}
getBalls();function getBalls(){
    canvas.height = H;    if(canvas.getContext){        var cxt = canvas.getContext('2d');        for(var i = 0; i < 50; i++){            var tempR = Math.floor(Math.random()*255);            var tempG = Math.floor(Math.random()*255);            var tempB = Math.floor(Math.random()*255);
            cxt.fillStyle = &#39;rgb(&#39; + tempR + &#39;,&#39; + tempG + &#39;,&#39; + tempB + &#39;)&#39;;            var tempW = Math.floor(Math.random()*W);            var tempH = Math.floor(Math.random()*H);            var tempR = Math.floor(Math.random()*50);
            cxt.beginPath();
            cxt.arc(tempW,tempH,tempR,0,Math.PI*2);
            cxt.fill();
        }
    }    
}</script>

接個小球做隨機運動,需要配合定時器更新小球的運動狀態。這時,需要對上面程式碼進行改寫

<button id="btn">更新</button><canvas id="canvas" width="500" height="300" style="border:1px solid black">当前浏览器不支持canvas,请更换浏览器后再试</canvas><script>btn.onclick = function(){history.go();}var canvas = document.getElementById('canvas');//存储画布宽高var H=300,W=500;//存储小球个数var NUM = 50;//存储小球var balls = [];function getBalls(){    if(canvas.getContext){        var cxt = canvas.getContext('2d');        for(var i = 0; i < NUM; i++){            var tempR = Math.floor(Math.random()*255);            var tempG = Math.floor(Math.random()*255);            var tempB = Math.floor(Math.random()*255);            var tempColor = &#39;rgb(&#39; + tempR + &#39;,&#39; + tempG + &#39;,&#39; + tempB + &#39;)&#39;;            var tempX = Math.floor(Math.random()*W);            var tempY = Math.floor(Math.random()*H);            var tempR = Math.floor(Math.random()*30+20);            var tempBall = {
                x:tempX,
                y:tempY,
                r:tempR,
                stepX:Math.floor(Math.random() * 4 -2),
                stepY:Math.floor(Math.random() * 4 -2),
                color:tempColor,
                disX:Math.floor(Math.random() * 3 -1),
                disY:Math.floor(Math.random() * 3 -1)
            };
            balls.push(tempBall);
        }
    }    
}function updateBalls(){    for(var i = 0; i < balls.length; i++){
        balls[i].stepY += balls[i].disY;
        balls[i].stepX += balls[i].disX;
        balls[i].x += balls[i].stepX;
        balls[i].y += balls[i].stepY;                 
    }
}function renderBalls(){    //重置画布高度,达到清空画布的效果    canvas.height = H;    
    if(canvas.getContext){        var cxt = canvas.getContext(&#39;2d&#39;);        for(var i = 0; i < balls.length; i++){
            cxt.beginPath();
            cxt.arc(balls[i].x,balls[i].y,balls[i].r,0,2*Math.PI);
            cxt.fillStyle = balls[i].color;
            cxt.closePath();
            cxt.fill();   
        }        
    }

}
getBalls();
clearInterval(oTimer);var oTimer = setInterval(function(){    //更新小球运动状态    updateBalls();    //渲染小球    renderBalls();
},50);</script>

碰壁檢測

  下面,增加小球的碰壁偵測功能,當小球面

function bumpTest(ele){    //左侧
    if(ele.x <= ele.r){
        ele.x = ele.r;
        ele.stepX = -ele.stepX;
    }    //右侧
    if(ele.x >= W - ele.r){
        ele.x = W - ele.r;
        ele.stepX = -ele.stepX;
    }    //上侧
    if(ele.y <= ele.r){
        ele.y = ele.r;
        ele.stepY = -ele.stepY;
    }    //下侧
    if(ele.y >= H - ele.r){
        ele.y = H - ele.r;
        ele.stepY = -ele.stepY;
    }
}

重疊效果

  canvas的合成屬性globalCompositeOperation表示後繪製的圖形怎樣與先繪製的圖形結合,屬性值是字串,可能值如下:

㜎的重疊效果為'xor',即為最終的效果展示 


当前浏览器不支持canvas,请更换浏览器后再试
<script>btn.onclick = function(){history.go();}var canvas = document.getElementById('canvas');//存储画布宽高var H=300,W=500;//存储小球个数var NUM = 30;//存储小球var balls = [];function getBalls(){    if(canvas.getContext){        var cxt = canvas.getContext('2d');        for(var i = 0; i < NUM; i++){            var tempR = Math.floor(Math.random()*255);            var tempG = Math.floor(Math.random()*255);            var tempB = Math.floor(Math.random()*255);            var tempColor = 'rgb(' + tempR + ',' + tempG + ',' + tempB + ')';            var tempR = Math.floor(Math.random()*30+20);            var tempX = Math.floor(Math.random()*(W-tempR) + tempR);            var tempY = Math.floor(Math.random()*(H-tempR) + tempR);            
            var tempBall = {
                x:tempX,
                y:tempY,
                r:tempR,
                stepX:Math.floor(Math.random() * 13 -6),
                stepY:Math.floor(Math.random() * 13 -6),
                color:tempColor
            };
            balls.push(tempBall);
        }
    }    
}function updateBalls(){    for(var i = 0; i < balls.length; i++){
        balls[i].x += balls[i].stepX;
        balls[i].y += balls[i].stepY; 
        bumpTest(balls[i]);
    }
}function bumpTest(ele){    //左侧
    if(ele.x &lt;= ele.r){
        ele.x = ele.r;
        ele.stepX = -ele.stepX;
    }    //右侧
    if(ele.x &gt;= W - ele.r){
        ele.x = W - ele.r;
        ele.stepX = -ele.stepX;
    }    //上侧
    if(ele.y &lt;= ele.r){
        ele.y = ele.r;
        ele.stepY = -ele.stepY;
    }    //下侧
    if(ele.y &gt;= H - ele.r){
        ele.y = H - ele.r;
        ele.stepY = -ele.stepY;
    }
}function renderBalls(){    //重置画布高度,达到清空画布的效果
    canvas.height = H;    
    if(canvas.getContext){        var cxt = canvas.getContext('2d');        for(var i = 0; i < balls.length; i++){
            cxt.beginPath();
            cxt.arc(balls[i].x,balls[i].y,balls[i].r,0,2*Math.PI);
            cxt.fillStyle = balls[i].color;
            cxt.closePath();
            cxt.fill();   
        }        
    }

}
getBalls();
clearInterval(oTimer);var oTimer = setInterval(function(){    //更新小球运动状态    updateBalls();    //渲染小球    renderBalls();
},50);</script>

更多canvas動態小球重疊效果相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn