UWP簡單示例(三):快速開發2D游戲引擎,uwp2d
准備
IDE:VisualStudio 2015
Language:VB.NET/C#
圖形API:Win2D
MSDN教程:UWP游戲開發
寫在前面的話
沒有什麼比重復造輪子更讓人心碎的事情了。
(如果有,那就是造了兩遍)
游戲開發涉及哪些技術?
- 游戲開發是一門復雜的藝術,編碼方面你需要考慮圖形、輸入和網絡
- 以及相對獨立的音頻、物理仿真和AI引擎等,每一個部分單獨開發都一場是曠日持久的“戰斗”
- 美術、音樂和劇本也是組成游戲的重要部分,當然引擎不必包含這些素材
不要試圖一個人去完成所有的事情
- 設計和實現完整的游戲引擎並不是一件輕松的事情
- 制定幾個特定的目標,然後將有限的時間花在這些“簡單的”但靠譜的目標上
- 得益於開源社區,你可以很便捷的找到各類完善的開源引擎,懂得借鑒它們並完善自己。
第一節 場景
你輕輕閉上眼睛,腦海中回想起過往的某個畫面,美好的畫面喻示著你此刻的心情還不錯。我們稱組成這個畫面的所有元素就是一個場景(Scene)。
(上述定義從某個角度告訴我們,場景是一系列游戲元素的集合,但這不能很好地說明什麼是場景)
場景包含哪些元素?
- 攝像機 Camera
- 圖層 Layer
- 物體 Body
- 外部資源 Resource
場景攝像機
- 攝像機是場景中一類特殊對象,幾乎具有可視化對象的全部屬性與行為,但它是不可見的
- 攝像機與場景繪制緊密相關,平面變換、效果和動畫都將作用於攝像機裁剪時或裁剪後的畫面
- 場景中允許多個攝像機存在,但同一時間最多一個會被激活
- 通過攝像機實現場景虛擬化,由可視化元素是否在攝像機視口內決定它是否要被繪制
資源加載與預繪制
- 場景繪制與更新前需要先加載外部資源和預繪制
- 外部資源包括貼圖、音頻、文本和用戶自定義數據
- 預繪制完成內存占用較多的緩存對象的繪制
- 若加載花費一段時間,需要向用戶提供加載動畫
- 不同場景之間資源不共享,這意味著切換場景必須重新加載資源
圖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
事件
- 為某個事件提供事件通知
- 可以動態的為某個事件注冊事件處理程序
- 事件處理機制可為游戲元素實現豐富的行為
繪制
- 只有可視化的對象具有該行為
- 為節約性能,一個可繪制的元素可以緩存成靜態圖像
- 為保證畫面在不同機器上的流暢性,需要設定渲染級別
*元素集合變動
- 游戲過程中修改游戲元素集合會導致集合不能遍歷
- 一種方法是先將集合改動的行為緩存起來,當一幀結束後再執行這些行為
- 另一種方法是使用線程安全的集合,在集合遍歷期間的更新操作將會被阻塞
圖5.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 物理引擎關節類繼承層次
附錄
下面,為你介紹兩款適用於UWP的游戲引擎
開源:GitHub.EDGameEngine
作者:ExperDot
復雜度:
簡介:適用於UWP的2D游戲圖形引擎 ,提供豐富的游戲模型庫與組件庫
說明:整合了我之前博客裡的自然樹、粒子系統和自動繪圖模型,以及一些有趣的效果組件
開源:GitHub.N2Engine
作者:Nukepayload2
復雜度:
簡介:用於支持任意能夠生成可移植類庫的.NET語言制作基於 Win2D 和 MonoGame 兩種圖形框架的跨平台游戲
說明:目前完成度低,你可以在Issue中浏覽Stone1.0的完整設計(對此感興趣也可以貢獻Contributions)
參考書籍
《AI Game Engine Programming》(美) BrianSchwab 著
《Object-Oriented Game Development》(美) Julian Gold 著
《Ulimate Game Design-Building Game Worlds》(美) Tom Meigs 著