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