面向对象的程序设计在游戏开发中使用(一):类
我并不是游戲開發的從業人員,甚至連軟件開發都不是,但至少我是程序員。
我認為,一個【面向對象】的理念在學習過程中的重要性遠大于對于代碼本身含義的認識。
這一點可以在諸多書籍中得到論證,但很奇怪的一件事是,絕大部分的視頻入門教程和并沒有過多的強調這一點。
如果你是擁有項目開發經驗的開發者,你或許理解面向對象的程序設計,和這種設計方法所代表的背后的意義。
但是作為大部分的學習者,這個概念更多的意味著一種高深的東西,就像初中的新生看到高中部的大孩子們在廁所吸煙。
本(系列)文意在使用一種遠離代碼的、更加通俗易懂的方式介紹什么是面向對象、它所帶來的好處,和如何將這種思想使用在游戲開發當中。
本文不會涉及實際的代碼或者程序語言,所以就算你只是有愿望學習編程也可以輕松看懂,至少我是這么希望的。
類
類是在面向對象中最基礎的一個概念,他可以在編程時讓程序員的思考更加連續,不會被諸多瑣碎的細節帶入到死胡同,或者被代碼的細節過多的耽誤時間。
理論上你可以吧所有的東西都封裝到類,然后再組合到一起,比如當你需要一臺電腦,你可以從一個個元器件類組裝成電路板類,再把電路板拼成一臺電腦類。
或者更甚,可以給組成元器件的材料都做成一個個類,再用他們組成元器件。
但是具體做到什么樣的細節,這是由編程者也就是你,決定的。
回到原點,到底什么是類。
類就如同我們正常認識的一樣,在程序中的類就是一類東西,比如筆類。讓我們想想筆時什么樣的,作為一支筆,我們關心筆的什么,筆有墨水,有他的好壞,書寫的粗細,顏色,我們就從這談起。
首先,墨水如果你不想過多的因為墨水打斷思考,可以把他作為一個墨水類,面向對象的優點已經體現出來了不是嘛?
再說好壞,同樣的,如果你想詳細的描述損傷程度、磨損、裂縫,你們還可以作一個損傷類詳細的描述他,也可以簡單的用一個yes or no來直接的講述。
顏色也是同樣的,可有通過一個顏色類來處理這個部分,當然顏色是由墨水決定的,我們會吧顏色放在墨水的下面,而在書寫時交由墨水,再由墨水與顏色溝通。最終創造出可以隨意改變顏色的墨水,但是墨水寫在紙上還是墨水或者墨跡,在處理時可以更復雜讓筆里的墨水創造出墨跡類,這個時候墨跡可以自由的控制自己的顏色,當光跑到墨跡上讓墨跡自己決定自己的顏色。
那么再回頭看看,什么是類,我們可以說出,類是作為一種概念,描述一系列相同的東西,那么反過來講,我們如果有一些新的功能,或者我們為更大的目的去編寫代碼、或者使用斷點或者直接print來查看一些數值,可以更方便的吧這一改動加入到所有一系列的東西,而不用過多的擔心忘記一些細節。
類的繼承
在有了上述基本的概念后,我們注意到我們之談到了筆,而沒有談鉛筆,圓珠筆還是鋼筆。但是在這之上,我們實際用的并不是概念而是實際的物體,這一點我們在后面說明。
類的繼承,相當于在一個大的概念下的小概念,比如鉛筆是筆,鋼筆也是筆,當我們同時要使用鉛筆鋼筆的時候,我們可以通過創建一個筆的大類,對于不同的筆我們可以通過繼承的方法,完成他們不同的功能。在不用重新完成筆的工作之外,加入不同的筆的不同特性,或者針對這些特性不同的修改方式。比如對于鉛筆,他的粗細是會變動的,我們就可以在寫的時候由鉛筆自己根據程序內容改變筆尖粗細,比如越寫越粗。
通過繼承特性,我們可以梗靈活的吧一些更大的東西拆解出來,一系列相似的東西組成更大的類,來節省代碼量。但是繼承和包含是不相同的,如我們剛剛所說的,筆里有墨水,但很明顯墨水不是筆的子類。
在類和繼承上,有更多的內容,手機號碼購買平臺涉及到不同語言處理的細節,但是我們不會深入到代碼或者某個語言層面而只是做個介紹。
單件類
單件類是只有一個實例的類,但是我們還沒談到實例,所以可以為只有一個目標的概念,特定的,我剛買的第一支筆,這是一個概念但是明顯,這個概念只能指代一個東西。
多數情況下的游戲不需要太多的單件類,但是一個很重要的單件類是玩家。
對于單件類的編程方法,實際上使用到單件類并不常見,在Ruby中,單件類作為一個特性使得Ruby語言具有很高的可操作性,但是在更多情況下,單件類是作為單件模式的一部分,用以處理一些特殊的情況。
可以在設計模式找到更多關于其他設計模式的細節,我推薦你們都去看一看
這很有助于節約更多的思考時間
在理想狀態下,所有的物品應該都屬于他的單件類,但對于游戲,很明顯這會對性能產生影響,更重要的是,沒有必要。
程序中的類
一個很徹底的觀念,我們可以認為所有東西都是類,整數和字符是類,加減乘除也是類,包括類的本身,也是一類的類。
這個想法很Ruby,而基于這個思路,Ruby被稱為魔法語言,而且擁有極好的代碼體驗。
雖然這個想法有一些...極端,但是我認為這確實是我們看待問題正確的解決方式。
也就是前文中的,類的細致程度的控制。
游戲中的類
比如一個隨處可見的打飛機游戲,游戲內的玩家與敵人混戰,由于人被殺就會死,所以不管是玩家還是敵人,他們的從血量到生死控制,包括貼圖都是可以共通的,我們姑且把他們稱作把他們歸為【單位】類。
對于生死、移動限制、擊中判定、甚至行動方式,我們大可在單位類中通通寫好。
而同時,我們有友軍有敵軍,或者說是陣營。陣營這個屬性并不具備特殊之處,所有人都是與敵人作戰,我們只需要在創建他們時指定他們的陣營,他們就可以自發的互相攻擊。
但是在種類上,他們具有不同的血量、護甲、傷害、速度等等,我們可以從單位類繼承出種種不同的類,每一個敵人都可以是一種類。
然后我們需要一個玩家類,他與敵人最大的區別就是玩家可以進行控制。我之前說過他是個單件類,但不準確,應該說他可以是個單件類,也可以不是,簡單的比如射擊模式的改變,我們可以簡單的吧設計模式獨立出一個射擊模式類,并吧射擊模式作為一個模塊,根據需要替換,當然也可以吧射擊模式與機體綁定,在玩家升級之后給玩家一個全新的機體。
當然,決定權在你。和之前說的一樣,我們大可吧他們作為一個個更小的類,可以指定護甲和傷害的種類,指定不同元素之間的組合和相克,但是決定權還是在你。
總結
以上是生活随笔為你收集整理的面向对象的程序设计在游戏开发中使用(一):类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地球那么大的开放世界游戏怎么做?腾讯云高
- 下一篇: 浮岛物语(FORAGER): 在 Gam