物件導向的程式設計在遊戲開發中使用(一):類

遊資網發表於2019-05-24
物件導向的程式設計在遊戲開發中使用(一):類


我並不是遊戲開發的從業人員,甚至連軟體開發都不是,但至少我是程式設計師。
我認為,一個【物件導向】的理念在學習過程中的重要性遠大於對於程式碼本身含義的認識。
這一點可以在諸多書籍中得到論證,但很奇怪的一件事是,絕大部分的視訊入門教程和並沒有過多的強調這一點。

如果你是擁有專案開發經驗的開發者,你或許理解物件導向的程式設計,和這種設計方法所代表的背後的意義。

但是作為大部分的學習者,這個概念更多的意味著一種高深的東西,就像初中的新生看到高中部的大孩子們在廁所吸菸。

本(系列)文意在使用一種遠離程式碼的、更加通俗易懂的方式介紹什麼是物件導向、它所帶來的好處,和如何將這種思想使用在遊戲開發當中。

本文不會涉及實際的程式碼或者程式語言,所以就算你只是有願望學習程式設計也可以輕鬆看懂,至少我是這麼希望的。



類是在物件導向中最基礎的一個概念,他可以在程式設計時讓程式設計師的思考更加連續,不會被諸多瑣碎的細節帶入到死衚衕,或者被程式碼的細節過多的耽誤時間。

理論上你可以吧所有的東西都封裝到類,然後再組合到一起,比如當你需要一臺電腦,你可以從一個個元器件類組裝成電路板類,再把電路板拼成一臺電腦類。

或者更甚,可以給組成元器件的材料都做成一個個類,再用他們組成元器件。

但是具體做到什麼樣的細節,這是由程式設計者也就是你,決定的。

回到原點,到底什麼是類。

類就如同我們正常認識的一樣,在程式中的類就是一類東西,比如筆類。讓我們想想筆時什麼樣的,作為一支筆,我們關心筆的什麼,筆有墨水,有他的好壞,書寫的粗細,顏色,我們就從這談起。

首先,墨水如果你不想過多的因為墨水打斷思考,可以把他作為一個墨水類,物件導向的優點已經體現出來了不是嘛?

再說好壞,同樣的,如果你想詳細的描述損傷程度、磨損、裂縫,你們還可以作一個損傷類詳細的描述他,也可以簡單的用一個yes or no來直接的講述。

顏色也是同樣的,可有通過一個顏色類來處理這個部分,當然顏色是由墨水決定的,我們會吧顏色放在墨水的下面,而在書寫時交由墨水,再由墨水與顏色溝通。最終創造出可以隨意改變顏色的墨水,但是墨水寫在紙上還是墨水或者墨跡,在處理時可以更復雜讓筆裡的墨水創造出墨跡類,這個時候墨跡可以自由的控制自己的顏色,當光跑到墨跡上讓墨跡自己決定自己的顏色。

那麼再回頭看看,什麼是類,我們可以說出,類是作為一種概念,描述一系列相同的東西,那麼反過來講,我們如果有一些新的功能,或者我們為更大的目的去編寫程式碼、或者使用斷點或者直接print來檢視一些數值,可以更方便的吧這一改動加入到所有一系列的東西,而不用過多的擔心忘記一些細節。

類的繼承

在有了上述基本的概念後,我們注意到我們之談到了筆,而沒有談鉛筆,圓珠筆還是鋼筆。但是在這之上,我們實際用的並不是概念而是實際的物體,這一點我們在後面說明。

類的繼承,相當於在一個大的概念下的小概念,比如鉛筆是筆,鋼筆也是筆,當我們同時要使用鉛筆鋼筆的時候,我們可以通過建立一個筆的大類,對於不同的筆我們可以通過繼承的方法,完成他們不同的功能。在不用重新完成筆的工作之外,加入不同的筆的不同特性,或者針對這些特性不同的修改方式。比如對於鉛筆,他的粗細是會變動的,我們就可以在寫的時候由鉛筆自己根據程式內容改變筆尖粗細,比如越寫越粗。

通過繼承特性,我們可以梗靈活的吧一些更大的東西拆解出來,一系列相似的東西組成更大的類,來節省程式碼量。但是繼承和包含是不相同的,如我們剛剛所說的,筆裡有墨水,但很明顯墨水不是筆的子類。

在類和繼承上,有更多的內容,涉及到不同語言處理的細節,但是我們不會深入到程式碼或者某個語言層面而只是做個介紹。

單件類

單件類是隻有一個例項的類,但是我們還沒談到例項,所以可以為只有一個目標的概念,特定的,我剛買的第一支筆,這是一個概念但是明顯,這個概念只能指代一個東西。

多數情況下的遊戲不需要太多的單件類,但是一個很重要的單件類是玩家。

對於單件類的程式設計方法,實際上使用到單件類並不常見,在Ruby中,單件類作為一個特性使得Ruby語言具有很高的可操作性,但是在更多情況下,單件類是作為單件模式的一部分,用以處理一些特殊的情況。

可以在設計模式找到更多關於其他設計模式的細節,我推薦你們都去看一看

這很有助於節約更多的思考時間

在理想狀態下,所有的物品應該都屬於他的單件類,但對於遊戲,很明顯這會對效能產生影響,更重要的是,沒有必要。

程式中的類

一個很徹底的觀念,我們可以認為所有東西都是類,整數和字元是類,加減乘除也是類,包括類的本身,也是一類的類。

這個想法很Ruby,而基於這個思路,Ruby被稱為魔法語言,而且擁有極好的程式碼體驗。

雖然這個想法有一些...極端,但是我認為這確實是我們看待問題正確的解決方式。

也就是前文中的,類的細緻程度的控制。

遊戲中的類

比如一個隨處可見的打飛機遊戲,遊戲內的玩家與敵人混戰,由於人被殺就會死,所以不管是玩家還是敵人,他們的從血量到生死控制,包括貼圖都是可以共通的,我們姑且把他們稱作把他們歸為【單位】類。

對於生死、移動限制、擊中判定、甚至行動方式,我們大可在單位類中通通寫好。

而同時,我們有友軍有敵軍,或者說是陣營。陣營這個屬性並不具備特殊之處,所有人都是與敵人作戰,我們只需要在建立他們時指定他們的陣營,他們就可以自發的互相攻擊。

但是在種類上,他們具有不同的血量、護甲、傷害、速度等等,我們可以從單位類繼承出種種不同的類,每一個敵人都可以是一種類。

然後我們需要一個玩家類,他與敵人最大的區別就是玩家可以進行控制。我之前說過他是個單件類,但不準確,應該說他可以是個單件類,也可以不是,簡單的比如射擊模式的改變,我們可以簡單的吧設計模式獨立出一個射擊模式類,並吧射擊模式作為一個模組,根據需要替換,當然也可以吧射擊模式與機體繫結,在玩家升級之後給玩家一個全新的機體。

當然,決定權在你。和之前說的一樣,我們大可吧他們作為一個個更小的類,可以指定護甲和傷害的種類,指定不同元素之間的組合和相剋,但是決定權還是在你。

作者:Kingfeng
來源:奶牛關
原地址:https://cowlevel.net/article/2050752

相關文章