天天看點

《互動式程式設計 第2版》一3.3 Processing應用程式基礎

本節書摘來華章計算機《互動式程式設計 第2版》一書中的第3章 ,第3.3節,joshua noble 著 毛順兵 張婷婷 陳宇 沈鑫 任燦江 譯更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

一個processing應用程式有兩個最基本的方法。一定要搞清楚它們是在何時運作的。一個是setup()方法,程式開始運作時會自動調用它。另一個是draw()方法,在程式運作期間,它會不斷被執行。好了,現在就來看看方法究竟是什麼。

方法是若幹指令的集合。一個方法實作一個相對獨立的功能。程式開始運作時,放在setup()方法中的所有指令都會被執行。你可以将它看做是一種準備工作。你平時不也經常做一些準備工作嗎?比如,要開始跑步了,先要做伸展運動;要飛去國外了,得先準備好護照;要做晚餐了,先要檢查一下冰箱裡有沒有你需要的所有食材。對于processing應用程式而言,setup()方法的作用是做一些基本設定,參見示例3-2。

示例3-2:methods.pde

這個代碼段發生了什麼?嗯,第一個單詞是這個方法的傳回類型。void表示沒有傳回。第二個單詞是方法的名稱。傳回類型和方法名稱放在一起,叫做方法聲明。如果你忘了什麼是方法聲明,請複習第2章。方法的其餘部分稱作方法體。符号{和}表示方法的開始和結束。中間的代碼也是方法,在processing語言中已經定義過了,可以直接拿來用。也就是說,你不必重新定義它們,隻需在調用它們的時候給它們正确的參數。

size()方法

上面代碼段中的第二行是size()方法。它有兩個參數:程式視窗中顯示區域的寬度和高度,這兩個參數都以像素為機關。以像素數來表示長度是很流行的做法。圖形程式、圖像或視訊編輯程式,以及運作這些程式的核心代碼都是這樣來表示長度的。抛掉英寸和厘米吧,在這個世界,所有東西都用像素數來表示。size()方法決定了程式運作視窗的大小。寫出前面的代碼,單擊“運作”按鈕。然後改變寬度和高度,再運作。你會看到size()方法的确有兩個參數:

void size(width, height)

當程式員們談到一個方法時,他們其實是指方法簽名。方法簽名的意思是,一個方法的名稱是什麼,它需要什麼參數,它會傳回什麼值。如果你對這點不太熟悉,就再複習一下第2章,尤其是關于方法的那節。在示例3-2中,size()方法的兩個參數都是整數,預設是十進制表示的。該方法傳回類型是void,即沒有傳回。

framerate()方法

下一個方法是framerate()。它的參數是幀速率,決定了程式每秒要顯示多少幀。processing程式每秒顯示的幀數絕不會超過你設定的值。不過它每秒顯示的幀數有可能低于你的設定值,比如你的視窗裡有太多東西要顯示,或者你的代碼效率太低。幀速率越大,意味着你的動畫運動得更快,所有東西都變快了。但這也意味着,如果你的程式是資料密集型的,processing可能會滞後。那麼幀速率是怎麼影響顯示效果的呢?答案是:你給framerate()設定的幀速率就是draw()方法每秒被調用的次數。

print()方法

print()方法輸出一條消息到processing內建開發環境下方的控制台。你可以輸出各種類型的東西:字元串消息、數值、某類對象的值等。這就提供了一種簡單途徑讓程式回報一些資訊;同時,當程式運作的結果和你的預期不符時,你也可以用它作為簡單調試手段。比如,你希望程式産生的結果是10?那麼用print()把結果顯示在控制台,看看實際的結果是什麼。print()輸出的所有資訊都顯示在processing內建開發環境下方的控制台,如圖3-2所示。

《互動式程式設計 第2版》一3.3 Processing應用程式基礎

圖3-2:應用程式的控制台

draw()方法是應用程式繪圖的地方,此外它還有其他功能。它是程式的重要特征。該方法中的任何操作都會被不斷執行,每秒執行的次數就是用framerate()方法設定的幀速率。

下面的示例3-3就是關于draw()方法的一個簡單例子。

示例3-3:methods.pde

假設程式的幀速率是每秒30次,那麼每秒鐘"hi"消息字元串将會被輸出到processing內建開發環境的控制台30次。程式很簡單,但它告訴我們,draw()方法的實質是定義一些按照固定頻率不斷執行的操作。當然,需要在setup()方法執行後生效。

通過示例3-4來對稍微複雜一些的程式進行分析。

示例3-4:expanding.pde

首先,我們定義整型變量x來存放一個值:

因為x不是在方法内聲明的,是以它是全局變量,在程式運作期間一直存在。也就是說,如果你在draw()方法中将x設定為20,那麼在下次調用draw()方法時x的值仍然是20。全局變量很重要,你可以在某個方法中逐漸改變它的值。

注意: 這是作用域的概念。如果你對此沒有什麼印象,就需要複習第2章。

setup()方法是做基本設定,該程式中的setup()隻是簡單地設定了視窗大小。這裡沒有什麼值得探讨的,直接跳過去看draw()方法:

每次調用draw(),x都會在原來的基礎上加2。你也可以寫成x = x +2;,但下面的寫法意思一樣卻更簡單:

既然x已經變大了一些,可以用它在視窗裡畫一個大一些的圓:

注意: 關于ellipse()方法,3.4節中有更多的介紹。

如果x太大,圓就會太大,以至于無法正确地在視窗中顯示出來。這時需要将x重置為0:

在圖3-3中可以看到,随着x不斷遞增,繪制的圓也越來越大。

《互動式程式設計 第2版》一3.3 Processing應用程式基礎

圖3-3:畫圓程式示範

draw()方法很重要,因為processing應用程式利用它來進行人機互動。比如,如果沒有定義draw()方法,那麼滑鼠按下方法mousepressed()和滑鼠移動方法mousemove()就不會生效。這兩個方法将在3.5節中讨論。你可以這樣認為:draw()方法告訴應用程式,繪制每一幀時,你想監聽程式發生了什麼。即使draw()方法中什麼也沒有,你也應該定義一個draw()方法,這是一個好習慣。

繼續閱讀