第三章:創建類庫
內容介紹
主要內容:創建Core類并編寫
創建這個類主要是為了后續開發方便,并介紹游戲開發中的一種非常重要編程模式
單例模式,以及了解MonoGame基本圖形渲染知識
單例模式:
第一步我們得先了解什么是單例模式我先給出單例模式中比較書面的解釋
單例模式確保一個類只有一個實例,并提供全局訪問點,廣泛應用于資源管理、配置管理和多線程環境中
這個解釋大家也許會看不懂,沒關系我們接下來會給出比較大白話的解釋:
我們把單例模式想像成一個特殊的部門,有一個專門對外的對接員接收甲方的要求,每個部門只聽從對接員的指令,對接員在接收甲方的指令后會調用部門內對應的工作小組就會完成對接員發布的固定任務,這個任務的工作內容是固定的,甲方只需要呼叫對接員需要調用什么任務,對接員發出指令后就直接執行
相當于一個共用的方法庫:可以供大家使用,這個是我個人的理解大家理性參考:
在網絡上有許多單例模式的教程大家感興趣的可以去看看,單例模式應用很廣泛,不止游戲開發會用到,包括Web開發,軟件開發都會使用這個技術,我個人非常喜歡這項技術。
創建Core.cs文件
接下來我們在根目錄創建Core.cs代碼
在上方圖片中有一個文件加號的圖標點擊那個創建Core.cs
完整代碼看最后
第一步:包含必要庫
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
引用這個庫所必要的一些庫
第二部:創建類并實現單例模式
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;namespace SlimeGameLibrary;
// 繼承Game類實現窗口渲染
public class Core : Game
{// 接口:只允許內部訪問internal static Core instance;// 對外接口:讓外部訪問這個類的內部方法public static Core Instance => instance//外部訪問時調用,創建新的Corepublic Core(){// 保護內存安全// 如果當前已經創建了instance類時不允許重復創建// 并且拋出異常if (instance != null){throw new InvalidOperationException($"Only a single Core instance can be created");}// 如果沒有創建就創建一個新的instanceinstance = this;}
}
這個是MonoGame創建一個單例模式簡化版本:
- 聲明一個僅供每部訪問的實例
- 提供外部接口
- 初始化代碼
第三步:聲明初始化窗口必要組件
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;namespace SlimeGameLibrary;public class Core : Game
{internal static Core instance;public static Core Instance => instance;// 渲染管理器public static GraphicsDeviceManager Graphics { get; private set; }// 渲染組件public static new GraphicsDevice GraphicsDevice { get; private set; }// 精靈渲染public static SpriteBatch SpriteBatch { get; private set; }// 資源管理public static new ContentManager Content { get; private set; }// 新建窗戶必要組件:// 窗口標題// 寬度 高度// 是否全屏public Core(string title, int width, int height, bool fullScreen){if (instance != null){throw new InvalidOperationException($"Only a single Core instance can be created");}instance = this;Graphics = new GraphicsDeviceManager(this);// 初始化窗口信息Graphics.PreferredBackBufferWidth = width;Graphics.PreferredBackBufferHeight = height;Graphics.IsFullScreen = fullScreen;// 應用更改Graphics.ApplyChanges();// 設置窗口標題Window.Title = title;// 初始游戲資源管理器Content = base.Content;// 資源加載根目錄Content.RootDirectory = "Content";// 鼠標是否顯示IsMouseVisible = true;}// 生命周期初始化protected override void Initialize(){base.Initialize();GraphicsDevice = base.GraphicsDevice;SpriteBatch = new SpriteBatch(GraphicsDevice);}
}
這部分代碼主要創建了一些渲染窗口主要的組件:
- 窗口渲染組件
- 精靈渲染組件
- 重寫初始化方法
第四步:應用Core類:
這部分內容主要包含如何使用Core這個基類之后在創建新的游戲窗口也會更加的方便
- 第一步:刪除Game1.cs文件
- 第二步:創建新的GameMain.cs文件 (這兩部主要是我覺得Game1太難聽了大家想在Game1原代碼上編輯也是無所謂的)
- 第三步:編寫GameMain.cs文件
- 第四步:修改Program.cs文件
刪除Game1.cs文件
這步驟很簡單刪除就行了,右鍵刪除
這個時候如果你點開Program文件會有報錯不要擔心這是因為我們刪掉了Game1文件但是Program里依舊調用Game1文件的緣故
創建GameMain
依舊是在根目錄下創建GameMain文件記住了是.cs文件的后綴
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using SlimeGameLibrary;namespace SlimeGame;public class GameMain : Core
{public GameMain() : base("SlimeGame", 1280, 720, false){}protected override void Initialize(){// TODO: 增加你的初始化邏輯base.Initialize();}protected override void LoadContent(){// TODO: 在此處加載你的游戲資源base.LoadContent();}protected override void Update(GameTime gameTime){if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape))Exit(); // 退出游戲:按下Esc鍵或是手柄上的一個啥鍵// TODO: 在此處增加你的游戲主循環邏輯base.Update(gameTime);}protected override void Draw(GameTime gameTime){GraphicsDevice.Clear(Color.CornflowerBlue);// TODO: 增加你的渲染環境base.Draw(gameTime);}
}
最后再修改Program類的內容為
using var game = new SlimeGame.GameMain();
game.Run();
OK了,接下來我們創建這個類庫已經創建好了,基本就是這么一個流程,大家知道一個大概的框架,這部分代碼大家可以直接搬走,但是建議大家那個單例模式部分的內容再敲一次記住這個形式的,單例模式算是游戲開發中非常重要的內容了
結語:
這次文章就寫到這里,暑假到了我會全力更新這個系列,爭取暑假前更新,大家不要急我每篇文章都會盡力創建的,我也要開始學車了嘻嘻嘻,大家一起進步分享技術這個也是我寫博客的初衷,大家一起分享技術謝謝大家。
接下來還是照例問大家幾個問題: