最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

canvas游戲開發(fā)學(xué)習(xí)之三:繪制復(fù)雜形狀

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 15:13:14
文檔

canvas游戲開發(fā)學(xué)習(xí)之三:繪制復(fù)雜形狀

canvas游戲開發(fā)學(xué)習(xí)之三:繪制復(fù)雜形狀:貝塞爾和二次方曲線Bezier and quadratic curves接下來要介紹的路徑是貝塞爾曲線,它可以是二次和三次方的形式,一般用于繪制復(fù)雜而有規(guī)律的形狀。quadraticCurveTo(cp1x, cp1y, x, y) // BROKEN in Firefox 1.5 (see work
推薦度:
導(dǎo)讀canvas游戲開發(fā)學(xué)習(xí)之三:繪制復(fù)雜形狀:貝塞爾和二次方曲線Bezier and quadratic curves接下來要介紹的路徑是貝塞爾曲線,它可以是二次和三次方的形式,一般用于繪制復(fù)雜而有規(guī)律的形狀。quadraticCurveTo(cp1x, cp1y, x, y) // BROKEN in Firefox 1.5 (see work

貝塞爾和二次方曲線Bezier and quadratic curves

接下來要介紹的路徑是貝塞爾曲線,它可以是二次和三次方的形式,一般用于繪制復(fù)雜而有規(guī)律的形狀。

quadraticCurveTo(cp1x, cp1y, x, y) // BROKEN in Firefox 1.5 (see work around below)
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

上面兩行代碼的區(qū)別見右圖。它們都有一個起點(diǎn)一個終點(diǎn)(圖中的藍(lán)點(diǎn)),但二次方貝塞爾曲線只有一個(紅色)控制點(diǎn)點(diǎn))而三次方貝塞爾曲線有兩個。參數(shù) x和y是終點(diǎn)坐標(biāo),cp1x和cp1y 是第一個控制點(diǎn)的坐標(biāo),cp2x和cp2y是第二個的。

179.png

使用二次方和三次方的貝塞爾曲線是相當(dāng)有挑戰(zhàn)的,因?yàn)椴幌裨谑噶坷L圖軟件 Adobe Illustrator 里那樣有即時的視覺反饋。因?yàn)橛盟鼇懋嫃?fù)雜圖形是比較麻煩的。但如果你有時間,并且最重要是有耐心,再復(fù)雜的圖形都可以繪制出來的。下面我們來畫一個簡單 而又規(guī)律的圖形。這些例子都比較簡單。我們繪制的都是完整的圖形。

180.png

// Quadratric curves example
ctx.beginPath();
ctx.moveTo(75,25);
ctx.quadraticCurveTo(25,25,25,62.5);
ctx.quadraticCurveTo(25,100,50,100);
ctx.quadraticCurveTo(50,120,30,125);
ctx.quadraticCurveTo(60,120,65,100);
ctx.quadraticCurveTo(125,100,125,62.5);
ctx.quadraticCurveTo(125,25,75,25);
ctx.stroke();

通過計算,可以由二次曲線的單個控制點(diǎn)得出相應(yīng)三次方曲線的兩個控制點(diǎn),因此二次方轉(zhuǎn)三次方是可能的,但是反之不然。僅當(dāng)三次方程中的三次項(xiàng)為零是才可能轉(zhuǎn)換為二次的貝塞爾曲線。通常地可以用多條二次方曲線通過細(xì)分算法來近似模擬三次方貝塞爾曲線。

181.png

// Bezier curves example
ctx.beginPath();
ctx.moveTo(75,40);
ctx.bezierCurveTo(75,37,70,25,50,25);
ctx.bezierCurveTo(20,25,20,62.5,20,62.5);
ctx.bezierCurveTo(20,80,40,102,75,120);
ctx.bezierCurveTo(110,102,130,80,130,62.5);
ctx.bezierCurveTo(130,62.5,130,25,100,25);
ctx.bezierCurveTo(85,25,75,37,75,40);
ctx.fill();

矩形路徑 Rectangles

除了上面提到的三個方法可以直接繪制矩形之外,我們還有一個rect方法是用于繪制矩形路徑的。

rect(x, y, width, height)

它接受四個參數(shù),x和y 是其左上角坐標(biāo),width和height 是其寬和高。當(dāng)它被調(diào)用時,moveTo方法會自動被調(diào)用,參數(shù)為(0,0),于是起始坐標(biāo)又恢復(fù)成初始原點(diǎn)了。

綜合樣例

在整個例子里,最值得注意的是roundedRect函數(shù)的使用和fillStyle屬性的設(shè)置。自定義函數(shù)對于封裝復(fù)雜圖形的繪制是非常有用的。在這個例子里使用自定義函數(shù)就省掉了大約一半的代碼。在接下來的例子里會深入探討fillStyle屬性的使用。這里是用它來改變填充顏色,從默認(rèn)的黑色,到白色,然后再回到黑色。

182.png

function draw() {
 var ctx = document.getElementById('canvas').getContext('2d');
 roundedRect(ctx,12,12,150,150,15);
 roundedRect(ctx,19,19,150,150,9);
 roundedRect(ctx,53,53,49,33,10);
 roundedRect(ctx,53,119,49,16,6);
 roundedRect(ctx,135,53,49,33,10);
 roundedRect(ctx,135,119,25,49,10);

 ctx.beginPath();
 ctx.arc(37,37,13,Math.PI/7,-Math.PI/7,false); //chiensexu 本來是true呵呵,反了
 ctx.lineTo(31,37);
 ctx.fill();
 for(i=0;i<8;i++){
 ctx.fillRect(51+i*16,35,4,4);
 }
 for(i=0;i<6;i++){
 ctx.fillRect(115,51+i*16,4,4);
 }
 for(i=0;i<8;i++){
 ctx.fillRect(51+i*16,99,4,4);
 }
 ctx.beginPath();
 ctx.moveTo(83,116);
 ctx.lineTo(83,102);
 ctx.bezierCurveTo(83,94,89,88,97,88);
 ctx.bezierCurveTo(105,88,111,94,111,102);
 ctx.lineTo(111,116);
 ctx.lineTo(106.333,111.333);
 ctx.lineTo(101.666,116);
 ctx.lineTo(97,111.333);
 ctx.lineTo(92.333,116);
 ctx.lineTo(87.666,111.333);
 ctx.lineTo(83,116);
 ctx.fill();
 ctx.fillStyle = "white";
 ctx.beginPath();
 ctx.moveTo(91,96);
 ctx.bezierCurveTo(88,96,87,99,87,101);
 ctx.bezierCurveTo(87,103,88,106,91,106);
 ctx.bezierCurveTo(94,106,95,103,95,101);
 ctx.bezierCurveTo(95,99,94,96,91,96);
 ctx.moveTo(103,96);
 ctx.bezierCurveTo(100,96,99,99,99,101);
 ctx.bezierCurveTo(99,103,100,106,103,106);
 ctx.bezierCurveTo(106,106,107,103,107,101);
 ctx.bezierCurveTo(107,99,106,96,103,96);
 ctx.fill();
 ctx.fillStyle = "black";
 ctx.beginPath();
 ctx.arc(101,102,2,0,Math.PI*2,true);
 ctx.fill();
 ctx.beginPath();
 ctx.arc(89,102,2,0,Math.PI*2,true);
 ctx.fill();
}
function roundedRect(ctx,x,y,width,height,radius){
 ctx.beginPath();
 ctx.moveTo(x,y+radius);
 ctx.lineTo(x,y+height-radius);
 ctx.quadraticCurveTo(x,y+height,x+radius,y+height);
 ctx.lineTo(x+width-radius,y+height);
 ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);
 ctx.lineTo(x+width,y+radius);
 ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
 ctx.lineTo(x+radius,y);
 ctx.quadraticCurveTo(x,y,x,y+radius);
 ctx.stroke();
}

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

canvas游戲開發(fā)學(xué)習(xí)之三:繪制復(fù)雜形狀

canvas游戲開發(fā)學(xué)習(xí)之三:繪制復(fù)雜形狀:貝塞爾和二次方曲線Bezier and quadratic curves接下來要介紹的路徑是貝塞爾曲線,它可以是二次和三次方的形式,一般用于繪制復(fù)雜而有規(guī)律的形狀。quadraticCurveTo(cp1x, cp1y, x, y) // BROKEN in Firefox 1.5 (see work
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top