準備
IDE:Visual Studiowindows
圖形 API:Win2D緩存
MSDN 教程:UWP遊戲開發安全
遊戲開發涉及哪些技術?網絡
- 遊戲開發是一門複雜的藝術,編碼方面你須要考慮圖形、輸入和網絡
- 以及相對獨立的音頻、物理仿真和 AI 引擎等,每個部分單獨開發都一場是曠日持久的「戰鬥」
- 美術、音樂和劇本也是組成遊戲的重要部分,固然引擎沒必要包含這些素材
不要試圖一我的去完成全部的事情性能
- 設計和實現完整的遊戲引擎並非一件輕鬆的事情
- 制定幾個特定的目標,而後將有限的時間花在這些「簡單的」但靠譜的目標上
- 得益於開源社區,你能夠很便捷的找到各種完善的開源引擎,懂得借鑑它們並完善本身。
第一節 場景
你輕輕閉上眼睛,腦海中回想起過往的某個畫面,美好的畫面喻示着你此刻的心情還不錯。咱們稱組成這個畫面的全部元素就是一個場景(Scene)。動畫
(上述定義從某個角度告訴咱們,場景是一系列遊戲元素的集合)ui
場景包含哪些元素?編碼
- 攝像機 Camera
- 圖層 Layer
- 物體 Body
- 外部資源 Resource
場景攝像機spa
- 攝像機是場景中一類特殊對象,幾乎具備可視化對象的所有屬性與行爲,但它是不可見的
- 攝像機與場景繪製緊密相關,平面變換、效果和動畫都將做用於攝像機裁剪時或裁剪後的畫面
- 場景中容許多個攝像機存在,但同一時間最多一個會被激活
- 經過攝像機實現場景虛擬化,由可視化元素是否在攝像機視口內決定它是否要被繪製
資源加載與預繪製 線程
- 場景繪製與更新前須要先加載外部資源和預繪製
- 外部資源包括貼圖、音頻、文本和用戶自定義數據
- 預繪製完成內存佔用較多的緩存對象的繪製
- 若加載花費一段時間,須要向用戶提供加載動畫
- 不一樣場景之間資源不共享,這意味着切換場景必須從新加載資源
圖1-1 可視對象接口繼承層次(僅供參考)
第二節 圖層
你試圖向我描述回憶畫面,遠處縹緲隱現的連綿山峯,近處一片相對開闊的草地,天空彷佛還有着淅瀝的小雨。不像3D畫面能夠自然的展示景深關係,2D須要依賴圖層(Layer)來實現。
(分層繪製不只能表達景深,還能夠很容易地爲不一樣圖層定製不一樣的行爲)
圖層怎麼分類?
- 靜態層 StaticLayer
- 動態層 AnimateLayer
- UI層 ControlLayer
靜態層
- 一般由一副靜態圖像組成,玩家不能改變其中的內容
- 一些景深豐富的遊戲還會有超前景圖層,它也是靜態的
動態層
- 玩家直接控制的角色所在的圖層
- 主景圖層一般由區塊( Tile )和角色( Character )組成
- 區塊構成場景環境,角色則在區塊上活動
- 區塊嚴格意義上不是靜態的,可能會有來自玩家的破壞
UI層
- 展示 UI 的圖層,好比顯示消息框、文本框或按鈕
- 有時候用戶接觸的 UI 可能來自外部,而不是場景中的元素
圖2-1 圖層類繼承層次(僅供參考)
第三節 物體
我對你的回憶產生了興趣並但願瞭解更多的細節,你向我繼續描述,草地上青草隨風浮動,天空偶有不知名的鳥兒飛過。具體的某個可視化元素咱們稱之爲物體(Body)。
(通常狀況下,2D 遊戲中的物體是一個 Sprite)
物體有哪些屬性?
- 平面變換 Transform:描述元素的平面變換
- 外觀 Appearance:描述元素的外觀
- 附加組件 Compnent:表示附加在元素上的遊戲組件
平面變換
- 平移 Translation :元素在場景中的位置
- 旋轉 Rotation :元素繞旋轉中心旋轉
- 縮放 Scale :元素垂直或水平縮放
外觀
- 可見性 Visible :元素是否可見
- 透明度 Opacity :元素不透明度
*模型與視圖分離
- 模型是遊戲中可視化對象的數據
- 視圖是決定如何渲染模型的對象
- 分離的好處之一是同一模型可綁定不一樣的視圖
- 改變一個模型的渲染行爲,只要改變與它綁定的視圖便可
圖3-1 視圖類繼承層次(僅供參考)
第四節 行爲
你繼續回憶,腦海中畫面不斷的變化,有新的景象出現,也有舊的消失不見。畫面中總有一些元素是動態的(Dynamic),它們具備本身特定的行爲(Behavior)。
(行爲就是遊戲元素作出動做,發出聲音,做出反應)
元素有哪些行爲?
- 初始化 Start
- 更新 Update
- 事件 Event
- 繪製 Draw
初始化
- 完成元素初始化的操做
- 好比指定元素的初始位置,綁定事件等
- 一般在整個元素的生命週期中初始化只進行一次
- 屢次初始化可能會致使某個事件屢次綁定事件處理程序
更新
- 每幀調用並執行的操做
- 一般更新幀率與繪製幀率保持一致
- 有的遊戲元素不必每幀都更新,好比計算量大的 AI
事件
- 爲某個事件提供事件通知
- 能夠動態的爲某個事件註冊事件處理程序
- 事件處理機制可爲遊戲元素實現豐富的行爲
繪製
- 只有可視化的對象具備該行爲
- 爲節約性能,一個可繪製的元素能夠緩存成靜態圖像
- 爲保證畫面在不一樣機器上的流暢性,須要設定渲染級別
*元素集合變更
- 遊戲過程當中修改遊戲元素集合會致使集合不能遍歷
- 一種方法是先將集合改動的行爲緩存起來,當一幀結束後再執行這些行爲
- 另外一種方法是使用線程安全的集合,在集合遍歷期間的更新操做將會被阻塞
圖4-1 不一樣行爲預製件類繼承層次(僅供參考)
第五節 組件
我吐槽你沒有什麼想象力,你描述的畫面中蜻蜓和鳥兒都是在飛,而不是其中一個會在陸地上飛奔。一般不一樣的元素頗有可能會具備相同的行爲,這類行爲能夠封裝爲組件(Compnent)。
(組件有本身的屬性、方法和事件,但它們不能獨立存在,必須附加在遊戲物體上)
有哪些類型的組件?
- 動畫器 Animation
- 效果器 Effect
- 音效器 Audio
- 觸發器 Trigger
- 命令器 Command
- 行爲器 Behavior
動畫器
- 附加於遊戲對象的動畫器在時間線的控制下播放一段動畫
- 多種動畫常常組合在一塊兒,好比角色跳躍時既有幀位圖動畫也有按路徑移動的動畫
- 理想狀況下,遊戲中應使用盡量多的動畫來加強畫面效果,使得遊戲更具備吸引力
音效器
- 附加於遊戲對象的音效器用於播放一段音頻
- 音效對烘托遊戲環境氣氛起着十分關鍵的做用
- 音效器最有必要體現的是動態感和方位感
- 高性能的音效引擎應該是低延遲的且支持動態緩衝
- XAudio2 支持同步採樣準確播放以及隱式源速率轉換
效果器
- 平面變換 Transform :平移、旋轉和縮放
- 高斯模糊 GaussianBlur :減小噪聲或下降細節層次
- 顏色矩陣 ColorMatrix :特殊的位圖顏色變化效果
- 光照效果 Light :點光源,方向光源,全局光照
- 陰影效果 Shadow :生成模糊的陰影
觸發器
- 觸發器由三個部分組成,事件、條件、動做
- 事件:當某個事件發生的時候就運行觸發器
- 條件:判斷是否達到指定的條件,若是沒有達到條件將不執行動做
- 動做:條件經過後所要作的事情
命令器(行爲器)
- 命令器和行爲器是決定遊戲對象如何進行動做的附加對象
- 命令器是行爲器的超集,前者區別於後者是它在每幀都會有更新行爲
- 很顯然,行爲器只是控制下一步的動做,命令器則是控制時間線上的一系列動做
圖5-1 組件接口繼承層次(僅供參考)
第六節 真實
你迴應這是真實的回憶而不是夢境,鳥兒只會在藍天翱翔。事實上,遊戲不是真實的(Reality),只是感受上有些真實。
(遊戲中儘可能讓玩家感覺真實的部分就是物理仿真與遊戲AI)
物理引擎
- 物理引擎經過爲剛性物體賦予真實的物理屬性的方式來計算剛體運動、旋轉和碰撞
- 爲每一個遊戲或者每一個遊戲對象使用物理引擎並非徹底必要的
- 取決於需求,遊戲運行時的物體引擎須要平衡實時性和高精度二者
Box2D 引擎
- Box2D 以固定的離散時間步長實現遊戲物理世界的仿真
- Box2D 提供了支持像圓形或多邊形這樣的幾何形狀的剛體仿真
- Box2D 可用關節鏈接不一樣的形狀,還能夠包括關節馬達和滑輪
遊戲 AI
- 遊戲 AI 是遊戲中可以像人同樣思考和行動的元素
- AI 設計須要考慮趣味性、隨機性和難度三個因素
- AI 三大系統主要是感知系統、導航系統和決策系統
AI 分層
- 感知事件層:對輸入的信息進行過濾和分配
- 行爲層:具體描述如何執行指定動做
- 動畫層:判斷哪組動畫更符合當前遊戲狀態
- 運動層:處理探路、碰撞和躲避等行爲
- 短時間決策層:AI 實體短幅視距上的智能處理層
- 長期決策層:AI 實體開闊視距上的智能處理層
- 基於位置的信息層:包括來自影響圖、智能地形或相似結構的信息
*蜻蜓在地上飛奔
- 違背真實性或荒誕不經的設定雖然討趣,但最好不要讓玩家有上當的感受
- 除非你在一開始就告訴他,如遊戲名字叫《地上飛奔的蜻蜓》,玩家纔可能會原諒你
圖6-1 物理引擎關節類繼承層次(僅供參考)
附錄
《AI Game Engine Programming》[美] BrianSchwab 著
《Object-Oriented Game Development》[美] Julian Gold 著
《Ulimate Game Design-Building Game Worlds》[美] Tom Meigs 著