摘要:我發(fā)現(xiàn)網上的游戲開發(fā)教程大多是從某種語言或引擎的開發(fā)細節(jié)入手,而沒有一個提綱挈領式的整體介紹。碰撞檢測,以及碰撞后的事件響應。網絡請求數(shù)據(jù)更新同步等,判定游戲得分及勝負。這是游戲開發(fā)不可或缺的三個部分。
電子游戲是許多人喜愛甚至沉迷的事情。尤其對于程序員來說,開發(fā)游戲是不少人最初學習編程的動力。在之前,我發(fā)過一些游戲開發(fā)的教程和案例:
爆款游戲《貪吃蛇大作戰(zhàn)》的 Python 實現(xiàn)
如何用100行Python代碼做出魔性聲控游戲“八分音符醬”
熬夜寫了一個小游戲,向SpaceX聊表敬意
王校長一分鐘能吃多少熱狗?| 小游戲
《pygame入門教程》(公眾號 Crossin的編程教室 回復關鍵字 pygame )
游戲開發(fā)也是學習編程的一個很好方式 ,代碼上的各種增加和改動會立刻有直觀的反饋,讓你的學習過程顯得不那么枯燥。
不過游戲開發(fā)和一般編程初學時接觸的程序開發(fā)模式有一定的區(qū)別,剛上手可能很不適應。我發(fā)現(xiàn)網上的游戲開發(fā)教程大多是從某種語言或引擎的開發(fā)細節(jié)入手,而沒有一個提綱挈領式的整體介紹。作為一個有不少年游戲開發(fā)經驗的開發(fā)者,我今天就分享下這方面的經驗。
電子游戲的原理電子游戲的原理其實和電影的原理是一樣的,都是利用人的“ 視覺暫留 ”和“ 似動現(xiàn)象 ”,使原本離散的靜止圖像,看起來是連續(xù)的動態(tài)效果。
這種翻頁動畫就是最好的例子。只不過電影通過膠片和放映機把它自動化了,而電子游戲更進一步:不但可以自動連續(xù)播放,而且過程中你可以去控制畫面中的內容。這有賴于計算機程序的實現(xiàn),但本質是相通的。
我們平常玩的游戲,其實都是一張張圖像連續(xù)播放而成。播放的快慢,就是我們經常聽到的 “幀率”(FPS) 。當你的電腦配置跟不上游戲的要求,運行幀數(shù)很低時,會被戲稱為“幻燈片”,也正是由于這個原因。
基于此,游戲程序的代碼在結構上就和一般的程序就有了明顯的區(qū)別,就是:
主循環(huán)對于游戲來說,需要有一個不停執(zhí)行的循環(huán),不停產生圖像,并把它顯示到屏幕上。在我們 pygame 的教程中,你可以很明顯地看到這個:
while True: ...
在主循環(huán)里進行的各種讀寫、計算、處理、渲染……構成了游戲的每一幀。有一類游戲開發(fā)崗位常見的面試題,我面試 Ubisoft 的時候被問到過,后來也用來問過很多應聘者:
以一個 FPS 游戲為例,列舉游戲在一幀內需要處理哪些事情?
給出一份我的參考答案:
事件響應 ,主要是用戶的輸入。如鍵盤按鍵、鼠標移動、鼠標點擊、語音等。
更新游戲內元素的 運動狀態(tài) ,這一環(huán)節(jié)大多由物理引擎處理。如移動、下落、慣性等。
碰撞檢測 ,以及碰撞后的事件響應。如子彈擊中角色、拾取物品等。
電腦角色(NPC)的行為,即 電腦 AI 。
網絡請求、數(shù)據(jù)更新、同步 等,判定游戲得分及勝負。
計算或播放 動畫 效果。如人物動作、爆炸特效、樹木水面等環(huán)境效果。
渲染場景 畫面,包括光照效果等,即生成最終顯示的畫面。
這一些列動作需要用到大量 CPU 和 GPU(顯卡) 的計算。計算的快慢決定了游戲一幀的耗時。通常最耗時的操作在于 實時的動畫計算和光照渲染 。這就是為什么當你玩游戲卡頓時,可以通過調低畫面效果、關閉軟陰影/抗鋸齒、降低模型質量等方法改善,或者,買一塊更強大的顯卡……
游戲程序的主體結構抽象來說就是這樣一個流程:
這里提一個小細節(jié),就是如果我們計算運動是按照每一幀更新固定的長度來計算,就會出現(xiàn)運算速度快的電腦上幀數(shù)很高,運動就很快,反之差的電腦上就很慢(我們 pygame 教程里的打飛機游戲就是如此)。通常的解決方法,一種是 固定幀數(shù) ,大家都是30幀運行;還有一種就是對運動速度進行修正,最簡單的辦法就是 以固定值乘以上一幀實際消耗的時間 。
游戲中的設計模式談了游戲程序的整體結構,我再來說幾個游戲開發(fā)中常用設計理念和模式。
首先是 面向對象 。因為游戲大多是對現(xiàn)實場景的模擬和抽象,含有眾多角色和道具,所以它比其他程序更適合使用面向對象的設計。不少企業(yè)在面試時也會用游戲角色的設計來考察面向對象的概念。比如:一個兵種就是一個類,它有父類(角色),有子類(細分兵種),有屬性(血量、攻擊),有方法(攻擊、死亡)。
MVC模式(Model-View-Controller) ,即把 模型、視圖、控制器 分離開的設計。在游戲開發(fā)中,通過 MVC 模式,將游戲玩家、場景及角色的數(shù)據(jù)(Model)、游戲畫面和菜單的顯示(View)、游戲的輸入控制和邏輯處理(Controller)分離開,會讓程序的架構更合理,容易維護和擴展。
狀態(tài)機 。游戲中的角色,經常會有多種狀態(tài)的切換,比如第一人稱射擊游戲中的站立、跑動、開鏡、下蹲、臥倒等。如果簡單的通過一堆 if-else 來管理各種狀態(tài)的切換,會讓代碼十分繁瑣很難以維護。這時候可以了解下狀態(tài)機模式。
游戲開發(fā)之路在實際的開發(fā)中,幾乎沒有團隊是從零開始寫一個游戲,或多或少都會使用或自研 游戲引擎 。所謂游戲引擎,就是把我們前面說到的一些游戲中的通用工作,比如輸入處理、物理引擎、動畫、場景渲染、網絡交互等部分封裝起來,讓開發(fā)者可以專注于游戲本身玩法的開發(fā)。像之前提過的 Cocos、Unity,包括 pygame 都屬于游戲引擎的范疇,只不過各自的形式和側重點有所不同。
在引擎之上,游戲開發(fā)團隊還會為游戲制作專門的 編輯器 ,以方便游戲策劃人員編輯關卡和數(shù)值。如果你搗鼓過暴雪的魔獸爭霸、星際爭霸之類的編輯器,對此一定深有感觸。
一個最簡單的游戲團隊,一般也有三類人: 策劃、程序、美術 。這是游戲開發(fā)不可或缺的三個部分。策劃負責游戲的玩法、數(shù)值、關卡、劇情等設計,程序負責實現(xiàn)功能以及開發(fā)相關工具,美術負責各種視覺素材。再多一點可能還會有專門的動畫和音效人員;也有個人獨立開發(fā)者所有工作一肩挑。而如今的大制作游戲,團隊則要龐大許多,各種細化分工就遠不止這些了。
如果你有志于從事游戲行業(yè),或者想開發(fā)出屬于自己的游戲,我給出一點建議:
了解 游戲開發(fā) 的基礎,一般游戲引擎都有官方教程,跟著做
打牢 編程基礎 ,包括數(shù)據(jù)結構、算法、設計模式等
多了解各方面的知識,多點 興趣愛好 ,不僅僅是玩游戲。這對于寫代碼或許沒有直接幫助,但如果你想做自己的游戲,這些將會派上用場
多寫 。不要糾結太多,就從最弱最簡單的小游戲開始寫,一個接一個的寫。堅持下去,并不會太久,量變就會產生質變。
以上是我關于游戲開發(fā)的經驗與分享。你若有其他想了解的,歡迎留言討論。
════
其他文章及回答:
編程實訓 | 如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 人工智能 | 爬蟲 | 我用Python | requests | 計算機視覺
歡迎搜索及關注: Crossin的編程教室
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/43244.html
摘要:歲的余宙華是少兒編程培訓機構阿兒法營的創(chuàng)辦者,也是這個培訓機構課程體系的主要研發(fā)者。如今少兒編程培訓行業(yè)正越來越熱,最近幾年國內的少兒編程培訓機構雨后春筍般一個個地冒出來。這時,余宙華意識到是他作為父親出手的時候了。 什么是計算機的靈魂?余宙華用孩子式的語氣問長桌旁坐著的小女孩。 小女孩認真地想了半天,有些靦腆地猶豫著給出了余宙華期待的答案:程序。 2018年7月,我在阿兒法營海淀人大...
摘要:摘要是如何回收內存的深入淺出系列深入淺出第課箭頭函數(shù)中的究竟是什么鬼深入淺出第課函數(shù)是一等公民是什么意思呢深入淺出第課什么是垃圾回收算法最近垃圾回收這個話題非常火,大家不能隨隨便便的扔垃圾了,還得先分類,這樣方便對垃圾進行回收再利用。 摘要: JS是如何回收內存的? 《JavaScript深入淺出》系列: JavaScript深入淺出第1課:箭頭函數(shù)中的this究竟是什么鬼? Jav...
摘要:代碼倉庫近日,人民網慕課區(qū)塊鏈學院正式上線。此番,人民網慕課開辦區(qū)塊鏈學院,選擇,旨在鼓勵企業(yè)合力建設區(qū)塊鏈通用底層,優(yōu)化技術的資源配置,實現(xiàn)價值共享。 FISCO BCOS是完全開源的聯(lián)盟區(qū)塊鏈底層技術平臺,由金融區(qū)塊鏈合作聯(lián)盟(深圳)(簡稱金鏈盟)成立開源工作組通力打造。開源工作組成員包括博彥科技、華為、深證通、神州數(shù)碼、四方精創(chuàng)、騰訊、微眾銀行、亦筆科技和越秀金科等金鏈盟成員機構...
摘要:微信小程序自年發(fā)布至今,以其速度快體驗棒無適配等優(yōu)點,不斷實現(xiàn)著使應用觸手可及的夢想,為用戶生活的各個方面帶來了便利。 微信小程序自2017年發(fā)布至今,以其 速度快、體驗棒、無適配等優(yōu)點,不斷實現(xiàn)著使應用觸手可及的夢想,為用戶生活的各個方面帶來了便利。 showImg(https://segmentfault.com/img/remote/1460000019836007?w=1080...
閱讀 2335·2021-10-09 09:41
閱讀 1777·2019-08-30 15:53
閱讀 1025·2019-08-30 15:52
閱讀 3469·2019-08-30 11:26
閱讀 800·2019-08-29 16:09
閱讀 3460·2019-08-29 13:25
閱讀 2295·2019-08-26 16:45
閱讀 1957·2019-08-26 11:51