UWP简单示例(三):快速开发2D游戏引擎
準備
IDE:Visual Studio
圖形 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
事件
為某個事件提供事件通知
可以動態的為某個事件注冊事件處理程序
事件處理機制可為游戲元素實現豐富的行為
繪制
只有可視化的對象具有該行為
為節約性能,一個可繪制的元素可以緩存成靜態圖像
為保證畫面在不同機器上的流暢性,需要設定渲染級別
*元素集合變動
游戲過程中修改游戲元素集合會導致集合不能遍歷
一種方法是先將集合改動的行為緩存起來,當一幀結束后再執行這些行為
另一種方法是使用線程安全的集合,在集合遍歷期間的更新操作將會被阻塞
圖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 著
總結
以上是生活随笔為你收集整理的UWP简单示例(三):快速开发2D游戏引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑分区小教程笔记本电脑如何分区桌面
- 下一篇: 阿里云-文件预览