canvas練習(xí)之躁動(dòng)的小球

1.繪制若干個(gè)小球

2.讓每個(gè)小球都是些碰壁反彈

3.當(dāng)兩個(gè)小球之間的距離到達(dá)指定長(zhǎng)度時(shí),在這兩個(gè)小球中間繪制一條線。

由于每個(gè)小球的碰壁反彈都需要坐標(biāo)、半徑、顏色、速度等值,且每個(gè)小球的這鞋值都不一樣,如果使用普通的變量,那就需要大量的代碼實(shí)現(xiàn),所以我們可以結(jié)合面向?qū)ο蟮木幊趟枷?,?shí)現(xiàn)這樣的效果。

html:

<canvas id="canv" width="1000" height="600"></canvas>

script:

// 獲取畫(huà)布

var canv =document.getElementById('canv');

// 獲取畫(huà)筆

var ctx =canv.getContext('2d');

//承接所有的小球的數(shù)組

var? ? ballArr =[];

// 隨機(jī)數(shù)函數(shù)

function rn(min,max) {

return Math.round(Math.random()*(max-min))+min;

}

// 封裝一個(gè)小球類

function Ball(ox,oy,r,bg,vx,vy) {

// 添加公有屬性

? ? this.x = ox;

this.y = oy;

this.r = r;

this.bg = bg;

this.vx = vx;

this.vy = vy;

}

// 為小球類添加原型方法

Ball.prototype.move =function() {

// this指向當(dāng)前調(diào)用move函數(shù)的這個(gè)對(duì)象(從類中實(shí)例化的對(duì)象才可以調(diào)用)

// 改變x,y讓小球重新繪制

? ? this.x +=this.vx;

this.y +=this.vy;

// 繪制

? ? ctx.beginPath();

ctx.fillStyle =this.bg;

ctx.arc(this.x,this.y,this.r,0,2*Math.PI);

ctx.fill();

// 根據(jù)當(dāng)前的x和y,判斷是否需要反彈(改變vx,vy)

? ? if(this.x 1000 -this.r)

this.vx *= -1;

if(this.y 600 -this.r)

this.vy *= -1;

};

// 實(shí)例化若干個(gè)小球

function getBall() {

for(var i =0;i<200;i++) {

var r =rn(3,6);

var x =rn(r,1000-r);

var y =rn(r,600-r);

var vx =rn(-5,5);

var vy =rn(-5,5);

// 規(guī)避vx,vy為0的情況

? ? ? ? vx =vx ==0 ? -1 :vx;

vy =vy ==0 ?1 :vy;

var bg ='rgba('+rn(0,255)+','+rn(0,255)+',' +rn(0,255)+','+Math.random()+')';

var ball =new Ball(x,y,r,bg,vx,vy);

ballArr.push(ball);

}

}

getBall();

var mx;

var my;

canv.onmousemove =function (e) {

var ev =event || e;

mx =ev.offsetX;

my =ev.offsetY;

}

// 小球的圓心距滿足指定條件,畫(huà)線

function drawLine() {

for (var i =0;i

for (j =i +1;j

// 判斷呢ballArr[i]和ballArr[j]

? ? ? ? ? ? var a =ballArr[i];

var d =Math.sqrt(Math.pow(a.x -mx,2) +Math.pow(a.y -my,2));

if (d <=100) {

ctx.beginPath();

ctx.strokeStyle ='rgba(' +rn(255,0) +',' +rn(255,0) +',' +rn(255,0) +',' +rn(1,0.2) +')';

ctx.moveTo(mx,my);

ctx.lineTo(a.x,a.y);

ctx.stroke()

var b =ballArr[j];

// 圓心距

? ? ? ? ? ? ? ? var distance =Math.sqrt(Math.pow(a.x -b.x,2) +Math.pow(a.y -b.y,2));

// 圓心距小于指定范圍畫(huà)線

? ? ? ? ? ? ? ? if (distance <=50) {

ctx.beginPath();

ctx.strokeStyle ='rgba(' +rn(0,255) +',' +rn(0,255) +',' +rn(0,255) +',' +Math.random() +')';

ctx.moveTo(a.x,a.y);

ctx.lineTo(b.x,b.y);

ctx.stroke();

}

}

}

}

}

// 頻率繪制函數(shù)

function draw() {

ctx.clearRect(0,0,1000,600);// 清除畫(huà)布

// 讓所有小球都移動(dòng)

? ? for(var i inballArr){

ballArr[i].move();

}

drawLine();

requestAnimationFrame(draw);

}

draw();

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,142評(píng)論 0 2
  • 知乎的網(wǎng)頁(yè)版登錄界面的背景有很多運(yùn)動(dòng)的小球,小球和小球運(yùn)動(dòng)的時(shí)候之間還有連線,給人一種三維立體變換的效果,看著十分...
    小廚筆記閱讀 932評(píng)論 0 5
  • 上網(wǎng)搜索了angularjs裁剪,發(fā)現(xiàn)只有正方形和圓形 http://www.cnblogs.com/smilec...
    四腳蛇閱讀 834評(píng)論 0 1
  • 一:canvas簡(jiǎn)介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,880評(píng)論 2 32
  • 是村莊 我就義無(wú)反顧代言 都說(shuō)它鍍滿莊稼的色彩 是貧困落后的代表 誰(shuí)知道這是自由充實(shí)的國(guó)度 劣質(zhì)的過(guò)往早被鐮刀自...
    韓新文閱讀 315評(píng)論 5 7

友情鏈接更多精彩內(nèi)容