Processing摸索前行(4)
前面我們基本瞭解了在Processing中繪圖的基本流程和鍵盤及滑鼠互動必備的一些知識,當然,我們的摸索絕不可能止步於此,我們要一路堅持,繼續摸索前行。
我們在C++C#或者Java中已經感受到面對物件的好處,那麼在Processing中應該也是能夠實現類的設計和封裝的,否則我們的那些個圖形元素就不能按照我們的意圖進行管理了。比如,將各種圖形元素進行儲存,那就基本沒有辦法了。
我們來看看Processing的類是如何設計實現的。我們以繪製線條為例,我們要給我們的線條增加一些功能,比如繪製線條時要同時指定其透明度或者顏色,則必須通過stroke來完成。如果我們自己設計一個線條類,則可以把透明度及顏色的設定單獨分開,程式碼如下:
void setup() { size(560,300); Pline ln1=new Pline(40,40,220,40); Pline ln2=new Pline(40,140,220,140,color(10,160,50)); Pline ln3=new Pline(40,240,220,240,150); Pline ln4=new Pline(340,40,520,40,color(10,160,50),100); Pline ln5=new Pline(340,140,520,140); ln3.Color=color(160,10,10); ln3.StartX=340; ln3.EndX=520; ln3.drawline(); } class Pline { float StartX,StartY,EndX,EndY; float Alf=254; color Color= color(0,0,0); Pline(float sx,float sy,float ex,float ey) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; drawline(); } Pline(float sx,float sy,float ex,float ey,float alf ) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; Alf=alf; drawline(); } Pline(float sx,float sy,float ex,float ey,color clr ) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; Color=clr; drawline(); } Pline(float sx,float sy,float ex,float ey,color clr,float alf ) { StartX=sx; StartY=sy; EndX=ex; EndY=ey; Color=clr; Alf=alf; drawline(); } void drawline() { stroke(Color,Alf); line(StartX,StartY,EndX,EndY); noStroke(); } }
執行效果如下圖:
從上面的程式碼,我們可以看出,在Processing中定義類,與java中沒有什麼差別。我們這裡利用了建構函式的過載來實現了我們的不同個數的引數例項化。
當然,這樣增加了一個麻煩,那就是每次都要例項化一個類後才能夠劃線,在程式碼編寫的時候要多寫一個等號一個new以及類名稱。我們做這樣的類的封裝一定是想程式碼更簡單,那麼如果實現更簡單的程式碼呢,那就要用到靜態類或者靜態方法了。當然,使用靜態類有個問題,那就是靜態類中不能有非靜態方法和變數的呼叫。而Processing中的常用方法中有很多都是非靜態方法,如line 、fill和stroke等,這點我們事先必須注意。
當然,僅僅為了繪製一條線,可能我們感覺不不出類封裝有多少優勢,比如我們要繪製一個表格,表格的橫線和豎線之間的其實就是一個相對距離的差別,完全沒有必要重新開始去輸入起點座標和終點座標四個引數。下面我們來封住一個偏移函式offset,那麼繪製一個表格就變得高效一些了。
程式碼如下:
void setup()
{
size(560,380);
Pline ln1=new Pline(40,40,520,40);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
ln1.offsetLine(0,60);
Pline ln2=new Pline(40,40,40,340);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
ln2.offsetLine(80,0);
}
class Pline
{
float StartX,StartY,EndX,EndY;
float Alf=254;
color Color= color(0,0,0);
Pline(float sx,float sy,float ex,float ey)
{
StartX=sx;
StartY=sy;
EndX=ex;
EndY=ey;
drawline();
}
Pline(float sx,float sy,float ex,float ey,float alf )
{
StartX=sx;
StartY=sy;
EndX=ex;
EndY=ey;
Alf=alf;
drawline();
}
Pline(float sx,float sy,float ex,float ey,color clr )
{
StartX=sx;
StartY=sy;
EndX=ex;
EndY=ey;
Color=clr;
drawline();
}
Pline(Pline ln,color clr)
{
StartX=ln.StartX+20;
StartY=ln.StartY+20;
EndX=ln.EndX+20;
EndY=ln.EndY+20;
Color=clr;
drawline();
}
Pline(float sx,float sy,float ex,float ey,color clr,float alf )
{
StartX=sx;
StartY=sy;
EndX=ex;
EndY=ey;
Color=clr;
Alf=alf;
drawline();
}
Pline(Pline ln,color clr,float alf )
{
StartX=ln.StartX+20;
StartY=ln.StartY+20;
EndX=ln.EndX+20;
EndY=ln.EndY+20;
Color=clr;
Alf=alf;
drawline();
}
void drawline()
{
stroke(Color,Alf);
line(StartX,StartY,EndX,EndY);
noStroke();
}
void offsetLine(float offsetX,float offsetY)
{
StartX=StartX+offsetX;
StartY=StartY+offsetY;
EndX=EndX+offsetX;
EndY=EndY+offsetY;
drawline();
}
}
執行效果如下:
表格繪製好了,如果還封裝一些文字繪製的函式,那麼就很容易在Processing繪製我們需要的填充了文字的表格的了。我們下一篇繼續摸索。