物件導向與class

1. 製作一粒波子

想像一下,如果你現在要在畫面上,製作一粒會四面彈的波子,你會怎樣做?跟之前一樣,你首先需要幾個區:

  1. 宣告區:

    • 波子的位置

    • 波子的速度

    • 波子的顏色

  2. setup():

    • 初始化波子的位置

    • 初始化波子的速度

    • 初始化波子的顏色

  3. draw():

    • 填背景

    • 更新波子的位置

    • 繪畫波子

如果用程式碼做出來就會如下:

ball1

2. 用for製作多粒波子

那如果要做20粒的話, 你會怎樣做?之前有教過一個方法,是用List去做,方法如下:

ball2

3. 用class方法歸納多粒波子

上述方法沒有甚麼問題,好好地運作,你當然可以這樣去做。但如果在波子以外,你同時需要其他不同的元素,例如星球大戰遊戲,有20部飛船,每部飛船發出若干子彈,那就已經有2種元素,如果再加上小行星,就是三種,而每種元素都有自己對應的變數,那麼一開始的宣告區就會非常多不同變數,如果命名習慣不好,全部都是x, y, a, b等等,那麼要修改維護就會十分困難

那有沒有一種辦法,可以好好歸類這些變數,令程式更好維護呢?那就需要用到物件和class。用回上面的例子,要畫一粒波子,方法如下:

  1. 宣告區:

    • 波子物件

  2. setup():

    • 初始化波子物件

  3. draw():

    • 填背景

    • 更新波子物件的位置

    • 繪畫波子物件

ball1

效果是跟上面一模一樣的,分別只在於程式用上class去做。

image-20221020122804436

我將兩個程式side by side比較一下,你就會見到分別。比較特別的是,所有在class中的變數,都需要特別地用self去標明是這個class內的變數,所以看上去感覺會比較複雜一點,但如果你同時有多個差不多的變數,例如上述例子,星球大戰有飛船、子彈、小行星,如果你懶得命名叫shipPos, bulletPos, starPos等等,那在自己的class內,你可以全部統一命名為Pos,或者 xy,重複都沒有關係,因為注明了是self的話,就會知道是這一個class內的xy

4. 用class畫20粒波子

image-20221020124137024

對比起前面要分別在setup()draw()move()show()都各自做for重覆20次,今次用class的方法就十分簡潔,不需要理會class入面的內容,內容是不需要變的,只要用波子物件(b)重覆開20個就可以了。

詳細的教程可以參考官網這裡