UWP簡單示例(三):快速開發2D游戲引擎

来源:http://www.cnblogs.com/experdot/archive/2016/09/26/5877752.html
-Advertisement-
Play Games

準備 IDE:VisualStudio 2015 Language:VB.NET/C# 圖形API:Win2D MSDN教程:UWP游戲開發 寫在前面的話 沒有什麼比重覆造輪子更讓人心碎的事情了。 (如果有,那就是造了兩遍) 是否有必要開發游戲引擎? 現在市面上有很多成熟的跨平臺游戲引擎,對個人開發 ...


準備

  IDE:VisualStudio 2015

  Language:VB.NET/C#

  圖形API:Win2D

  MSDN教程:UWP游戲開發

寫在前面的話

       沒有什麼比重覆造輪子更讓人心碎的事情了。

  (如果有,那就是造了兩遍)

  是否有必要開發游戲引擎?

  • 現在市面上有很多成熟的跨平臺游戲引擎,對個人開發者也較為友好
  • 若你是一名C#開發者,可以選擇CocosSharpUnity3D
  • 尤其Unity3D,用它開發2D和3D游戲一樣出色
  • 當然,親自編寫一款簡單的2D游戲引擎也是一件讓人自信感滿滿的事情

  游戲開發涉及哪些技術?

  • 游戲開發是一門複雜的藝術,編碼方面你需要考慮圖形、輸入和網路
  • 以及相對獨立的音頻、物理模擬和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 著


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...