Processing-对象(class)
Processing 允許使用面向對象編程(OOP)技術來使 Processing 應用程序更易于開發和維護。與其他面向對象的語言一樣,Processing 使用?Class?的概念來定義對象模板。
我們先來看一個例子:假設平坦的馬路上跑著一輛轎車,轎車的顏色為白色,當前速度為1公里每小時,轎車類型為自動擋。現在我們想在Processing里繪制這樣一個場景,如何做呢?
// 定義轎車的顏色 color c; // 定義轎車的x坐標位置 float xpos; // 定義轎車的y坐標位置 float ypos; // 定義轎車的車速 float xspeed; // 環境初始化。 // 此方法在軟件啟動時,被系統調用一次。 void setup() {// 初始化窗口大小size(200, 200);// 初始化轎車顏色c = color(255);// 初始化轎車的x坐標xpos = width/2;// 初始化轎車的y坐標ypos = height/2;// 初始化轎車的車速xspeed = 1; } // 畫圖。 // 此方法被系統默認循環調用。 void draw() {// 設置窗體背景色為黑色background(0);// 調用display()方法display();// 調用drive()方法drive(); } // 自定義顯示轎車的方法 void display(){// 設置轎車的錨定點為矩形中心rectMode(CENTER);// 設置轎車的顏色fill(c);// 將轎車畫成矩形rect(xpos, ypos, 20, 10); } // 自定義轎車的制動方法 void drive(){// 轎車將在x軸上向前移動,// 移動的速度為xspeedxpos = xpos + xspeed;// 判斷轎車是否超出了窗體的右側,// 若超出,則轎車將從窗體左側重新駛入。if(xpos > width){// 將轎車的位置重新設置為窗體的左側xpos = 0;} }上面的這段代碼,就是我們通常最先想到的方法。這種方式很顯然不太友好,為什么這么說呢?假設我們想要再創建一輛轎車,顏色為紅色,速度為2公里每小時,那豈不是還要再定義一遍上面用到的變量?比如,車的顏色為了分別記錄兩輛車,所以要定義兩個color,位置記錄也要重新定義一遍,車速的變量也要重新定義一遍。以此類推,要是定義五輛轎車,那就要寫五遍同樣的變量。嗯,這確實是個問題。那應該怎么辦呢?
嗯,這就涉及到今天所要講的內容,對象。
真實的世界里,每個具體的事物都是對象,某一輛轎車,是一個對象,再一輛轎車,又是一個對象,多輛轎車,就是多個對象,以此類推。如果我們定義一個模具,通過這個模具可以馬上定制出,具有不同屬性的轎車,那不就方便了么?到那個時候,我們想要多少轎車,就可以很容易的定制出多少轎車。那這個模具,在Processing這里,稱之為class,也就是類。我們定義一個類,也就是定義了一個模具,以后想要多少轎車,就可以用這個模具定制出多少轎車。妙哉吧!好,讓我們看看這個類都包括哪些內容,具體怎么定義?
一般來說,一個類包括四部分,分別為,類名,數據,構造器,方法。那么,接下來讓我們講上面的示例改造成一個轎車的類,方便我們以后使用。
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;}} }上面代碼中,分別定義數據、定義構造器、定義方法。
1)構造器:
其命名要與類名保持一樣,然后會在定義對象的時候,自動調用。除此之外,構造器還可以進行初始化變量。定義一個新的對象,需要用到new關鍵字,緊接著就是類名,類名后面的括號,可以傳入構造器中,括號里定義的參數。比如定義一個新的轎車對象,示例代碼如下:
myCar = new Car(color(255, 0, 0), 0, 100, 1);2)方法:
每個方法都有返回數值,關鍵字void比較特殊,它定義了此方法可以沒有返回值,或者說,返回值可以為空。緊接著,后面的display()為方法名,括號里可以放傳入的參數,此處為空。如果方法的返回類型不是void,則需要在方法的最后一行添加一條return語句,return后面有一個空格,然后是需要返回的結果。由于此方法的返回類型為void,所以方法的最后一行的省掉了return語句。
好了,回到項目主體
// 聲明轎車變量myCar Car myCar1; Car myCar2; // 環境初始化。 // 此方法在軟件啟動時,被系統調用一次。 void setup() {// 設置窗口size(200, 200);// 創建myCar對象。// 并傳入四個參數:// 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); } // 畫圖 // 此方法被系統默認循環調用 void draw() {// 設置背景色為黑色background(0);// 調用myCar1對象的drive()方法myCar1.drive();// 調用myCar對象的display()方法myCar1.display();// 調用myCar2對象的drive()方法myCar2.drive();// 調用myCar2對象的display()方法myCar2.display(); }在上面的主體框架中,創建了兩個轎車對象,一個是myCar1,另一個是myCar2。在框架setup中進行創建,并初始化相應參數。在框架draw()方法中,對兩個對象的drive()方法和display()方法分別進行了調用。這里要說的一點是,調用對象的方法需要在對象后面加一個.,然后緊跟方法名。
參考:http://ohcoder.com/blog/2016/03/18/processing-fun-object/
最后,我們舉一個水滴擴散的例子:
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;}}}現在我們來看一下如何使用?Drop?類來構建一些利用用戶輸入的圖形。清單 4 給出使用?Drop?類的應用程序。第一步是創建一個水滴數組(稱為?drops)。之后進行幾個定義(drops?數組中的水滴數和工作索引)。在?setup?函數中,您可以創建顯示窗口并初始化?drops?數組(所有直徑為 0 或未使用)。draw?函數相當簡單,因為水滴的核心功能在類本身內部(清單 3?中的?spread?和?show)最后,添加 UI 部分,該部分允許用戶定義水滴從何處開始。mousePressed?回調函數通過當前鼠標位置(目前有一個直徑且是使用過的)初始化水滴,然后遞增當前水滴索引。
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
總結
以上是生活随笔為你收集整理的Processing-对象(class)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西部数码云服务器手记
- 下一篇: libusb-win32的使用方法