日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Processing-对象(class)

發布時間:2024/3/26 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。