Processing-对象(class)
Processing 允許使用面向?qū)ο缶幊?#xff08;OOP)技術(shù)來使 Processing 應(yīng)用程序更易于開發(fā)和維護(hù)。與其他面向?qū)ο蟮恼Z言一樣,Processing 使用?Class?的概念來定義對(duì)象模板。
我們先來看一個(gè)例子:假設(shè)平坦的馬路上跑著一輛轎車,轎車的顏色為白色,當(dāng)前速度為1公里每小時(shí),轎車類型為自動(dòng)擋。現(xiàn)在我們想在Processing里繪制這樣一個(gè)場景,如何做呢?
// 定義轎車的顏色 color c; // 定義轎車的x坐標(biāo)位置 float xpos; // 定義轎車的y坐標(biāo)位置 float ypos; // 定義轎車的車速 float xspeed; // 環(huán)境初始化。 // 此方法在軟件啟動(dòng)時(shí),被系統(tǒng)調(diào)用一次。 void setup() {// 初始化窗口大小size(200, 200);// 初始化轎車顏色c = color(255);// 初始化轎車的x坐標(biāo)xpos = width/2;// 初始化轎車的y坐標(biāo)ypos = height/2;// 初始化轎車的車速xspeed = 1; } // 畫圖。 // 此方法被系統(tǒng)默認(rèn)循環(huán)調(diào)用。 void draw() {// 設(shè)置窗體背景色為黑色background(0);// 調(diào)用display()方法display();// 調(diào)用drive()方法drive(); } // 自定義顯示轎車的方法 void display(){// 設(shè)置轎車的錨定點(diǎn)為矩形中心rectMode(CENTER);// 設(shè)置轎車的顏色fill(c);// 將轎車畫成矩形rect(xpos, ypos, 20, 10); } // 自定義轎車的制動(dòng)方法 void drive(){// 轎車將在x軸上向前移動(dòng),// 移動(dòng)的速度為xspeedxpos = xpos + xspeed;// 判斷轎車是否超出了窗體的右側(cè),// 若超出,則轎車將從窗體左側(cè)重新駛?cè)搿f(xpos > width){// 將轎車的位置重新設(shè)置為窗體的左側(cè)xpos = 0;} }上面的這段代碼,就是我們通常最先想到的方法。這種方式很顯然不太友好,為什么這么說呢?假設(shè)我們想要再創(chuàng)建一輛轎車,顏色為紅色,速度為2公里每小時(shí),那豈不是還要再定義一遍上面用到的變量?比如,車的顏色為了分別記錄兩輛車,所以要定義兩個(gè)color,位置記錄也要重新定義一遍,車速的變量也要重新定義一遍。以此類推,要是定義五輛轎車,那就要寫五遍同樣的變量。嗯,這確實(shí)是個(gè)問題。那應(yīng)該怎么辦呢?
嗯,這就涉及到今天所要講的內(nèi)容,對(duì)象。
真實(shí)的世界里,每個(gè)具體的事物都是對(duì)象,某一輛轎車,是一個(gè)對(duì)象,再一輛轎車,又是一個(gè)對(duì)象,多輛轎車,就是多個(gè)對(duì)象,以此類推。如果我們定義一個(gè)模具,通過這個(gè)模具可以馬上定制出,具有不同屬性的轎車,那不就方便了么?到那個(gè)時(shí)候,我們想要多少轎車,就可以很容易的定制出多少轎車。那這個(gè)模具,在Processing這里,稱之為class,也就是類。我們定義一個(gè)類,也就是定義了一個(gè)模具,以后想要多少轎車,就可以用這個(gè)模具定制出多少轎車。妙哉吧!好,讓我們看看這個(gè)類都包括哪些內(nèi)容,具體怎么定義?
一般來說,一個(gè)類包括四部分,分別為,類名,數(shù)據(jù),構(gòu)造器,方法。那么,接下來讓我們講上面的示例改造成一個(gè)轎車的類,方便我們以后使用。
class Car{color c;float xpos;float ypos;float xspeed;Car(color tempC, float tempXpos, float tempYpos, float tempXspeed){c = tempC;xpos = tempXpos;ypos = tempYpos;xspeed = tempXspeed;}void display() {rectMode(CENTER);fill(c);rect(xpos, ypos, 20, 10);}void drive(){xpos = xpos + xspeed;if (xpos > width) {xpos = 0;}} }上面代碼中,分別定義數(shù)據(jù)、定義構(gòu)造器、定義方法。
1)構(gòu)造器:
其命名要與類名保持一樣,然后會(huì)在定義對(duì)象的時(shí)候,自動(dòng)調(diào)用。除此之外,構(gòu)造器還可以進(jìn)行初始化變量。定義一個(gè)新的對(duì)象,需要用到new關(guān)鍵字,緊接著就是類名,類名后面的括號(hào),可以傳入構(gòu)造器中,括號(hào)里定義的參數(shù)。比如定義一個(gè)新的轎車對(duì)象,示例代碼如下:
myCar = new Car(color(255, 0, 0), 0, 100, 1);2)方法:
每個(gè)方法都有返回?cái)?shù)值,關(guān)鍵字void比較特殊,它定義了此方法可以沒有返回值,或者說,返回值可以為空。緊接著,后面的display()為方法名,括號(hào)里可以放傳入的參數(shù),此處為空。如果方法的返回類型不是void,則需要在方法的最后一行添加一條return語句,return后面有一個(gè)空格,然后是需要返回的結(jié)果。由于此方法的返回類型為void,所以方法的最后一行的省掉了return語句。
好了,回到項(xiàng)目主體
// 聲明轎車變量myCar Car myCar1; Car myCar2; // 環(huán)境初始化。 // 此方法在軟件啟動(dòng)時(shí),被系統(tǒng)調(diào)用一次。 void setup() {// 設(shè)置窗口size(200, 200);// 創(chuàng)建myCar對(duì)象。// 并傳入四個(gè)參數(shù):// tempC = color(255, 0, 0)// tempXpos = 0// tempYpos = 100// tempXspeed = 1myCar1 = new Car(color(255, 0, 0), 0, 100, 1);// 參見上面myCar1的注釋myCar2 = new Car(color(0, 255, 0), 0, 150, 1.5); } // 畫圖 // 此方法被系統(tǒng)默認(rèn)循環(huán)調(diào)用 void draw() {// 設(shè)置背景色為黑色background(0);// 調(diào)用myCar1對(duì)象的drive()方法myCar1.drive();// 調(diào)用myCar對(duì)象的display()方法myCar1.display();// 調(diào)用myCar2對(duì)象的drive()方法myCar2.drive();// 調(diào)用myCar2對(duì)象的display()方法myCar2.display(); }在上面的主體框架中,創(chuàng)建了兩個(gè)轎車對(duì)象,一個(gè)是myCar1,另一個(gè)是myCar2。在框架setup中進(jìn)行創(chuàng)建,并初始化相應(yīng)參數(shù)。在框架draw()方法中,對(duì)兩個(gè)對(duì)象的drive()方法和display()方法分別進(jìn)行了調(diào)用。這里要說的一點(diǎn)是,調(diào)用對(duì)象的方法需要在對(duì)象后面加一個(gè).,然后緊跟方法名。
參考:http://ohcoder.com/blog/2016/03/18/processing-fun-object/
最后,我們舉一個(gè)水滴擴(kuò)散的例子:
class Drop {int x, y; // Coordinate (center of circle)int diameter; // Diameter of circle (unused == 0).void init( int ix, int iy ) {x = ix;y = iy;diameter = 1;}void spread() {if (diameter > 0) diameter += 1;}void show() {if (diameter > 0) {ellipse( x, y, diameter, diameter );if (diameter > 500) diameter = 0;}}}現(xiàn)在我們來看一下如何使用?Drop?類來構(gòu)建一些利用用戶輸入的圖形。清單 4 給出使用?Drop?類的應(yīng)用程序。第一步是創(chuàng)建一個(gè)水滴數(shù)組(稱為?drops)。之后進(jìn)行幾個(gè)定義(drops?數(shù)組中的水滴數(shù)和工作索引)。在?setup?函數(shù)中,您可以創(chuàng)建顯示窗口并初始化?drops?數(shù)組(所有直徑為 0 或未使用)。draw?函數(shù)相當(dāng)簡單,因?yàn)樗蔚暮诵墓δ茉陬惐旧韮?nèi)部(清單 3?中的?spread?和?show)最后,添加 UI 部分,該部分允許用戶定義水滴從何處開始。mousePressed?回調(diào)函數(shù)通過當(dāng)前鼠標(biāo)位置(目前有一個(gè)直徑且是使用過的)初始化水滴,然后遞增當(dāng)前水滴索引。
Drop[] drops; int numDrops = 30; int curDrop = 0;void setup() {size(400, 400);ellipseMode(CENTER);smooth();drops = new Drop[numDrops];for (int i = 0 ; i < numDrops ; i++) {drops[i] = new Drop();drops[i].diameter = 0;} }void draw() {background(0);for (int i = 0 ; i < numDrops ; i++) {drops[i].spread();drops[i].show();} }void mousePressed() {drops[curDrop].init( mouseX, mouseY );if (++curDrop == numDrops) curDrop = 0; }參考:
https://www.ibm.com/developerworks/cn/opensource/os-datavis2/index.html
總結(jié)
以上是生活随笔為你收集整理的Processing-对象(class)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西部数码云服务器手记
- 下一篇: libusb-win32的使用方法