MonoGame 游戲開發框架日記 -03

第三章:創建類庫

內容介紹

主要內容:創建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了,接下來我們創建這個類庫已經創建好了,基本就是這么一個流程,大家知道一個大概的框架,這部分代碼大家可以直接搬走,但是建議大家那個單例模式部分的內容再敲一次記住這個形式的,單例模式算是游戲開發中非常重要的內容了


結語:

這次文章就寫到這里,暑假到了我會全力更新這個系列,爭取暑假前更新,大家不要急我每篇文章都會盡力創建的,我也要開始學車了嘻嘻嘻,大家一起進步分享技術這個也是我寫博客的初衷,大家一起分享技術謝謝大家。
接下來還是照例問大家幾個問題:

什么是單例模式?
為什么要創建Core類?
如何使用Core類?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87590.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AES 256 CBC加密和解密

AES-256-CBC 是一種對稱加密算法,使用 256位密鑰 和 CBC(Cipher Block Chaining)模式。它的典型使用場景包括對敏感信息進行加密存儲或傳輸。下面是 AES-256-CBC 的加密與解密的 Python 示例,使用 pycryptodome 庫: &a…

Git 版本控制完全指南:從入門到精通

Git 版本控制完全指南:從入門到精通 作為當今最流行的分布式版本控制系統,Git 已經成為開發者必備的技能之一。無論你是獨立開發者還是團隊協作,Git 都能幫助你高效管理代碼版本。本文將帶你從零開始,逐步掌握 Git 的核心概念和常…

408第三季part2 - 計算機網絡 - 計算機網絡分層結構

理解 PCI會放一些控制信息,源地址目的地址都在里面 SDU是放的數據 整個加起來是PDU 每一層的SDU都是上一層的PDU 看一看 也是簡單看一看就行 網絡層有時候也叫IP數據報 這里斷點下載的意思就是,你下載東西的時候網絡斷了,再連回來的時候會接…

打開攝像頭,服務器和客戶端傳輸攝像頭圖像數據

1&#xff1a;Camera Server 主要功能&#xff0c;打開攝像頭&#xff0c;接收客戶端請求 接收到客戶端請求“R”字符后開始傳輸攝像頭圖像。 #include "mainwindow.h" #include "ui_mainwindow.h"#include<QDebug>MainWindow::MainWindow(QWidget…

Android實現獲取前臺應用信息

Android實現獲取前臺應用信息 1.前言&#xff1a; 之前需要獲取在后臺運行的App信息&#xff0c;比如包名、版本這些常規的&#xff0c;今天是講解獲取在前臺的App信息&#xff0c;雖然App在前臺&#xff0c;但是具體的信息可能不知道&#xff0c;今天就嘗試獲取一下&#xf…

快訊|美團即時零售日訂單已突破1.2億,餐飲訂單占比過億

據美團內網公布信息顯示&#xff0c;截至22時54分&#xff0c;美團即時零售當日訂單已經突破了1.2億單&#xff0c;其中&#xff0c;餐飲訂單已超過1億單。 值得注意的是&#xff0c;就在當晚20時45分&#xff0c;美團內網曾顯示即時零售日訂單突破了1億。這也意味著&#xff…

pycharm2018配置gitee操作

一、gitee介紹及下載安裝 gitee介紹&#xff1a; gitee別名碼云&#xff0c;是中國的一個代碼托管平臺&#xff0c;類似于GitHub&#xff0c;基于Git技術&#xff0c;提供遠程倉庫托管、協作功能和開源社區服務&#xff0c;優勢包括訪問速度快、本地化服務和政策合規git和gite…

數據結構——棧的講解(超詳細)

數據結構——棧的講解&#xff08;超詳細&#xff09;-騰訊云開發者社區-騰訊云 #include"Stack.h" void STInit(ST* ps) {ps->arr NULL;ps->capacity ps->top 0; //總空間個數和有用空間個數都初始化為0 }void STDestroy(ST* ps) {if (ps -> arr) …

MySQL允許root用戶遠程連接

注意&#xff1a;在實際生產環境中&#xff0c;允許root用戶從任意主機&#xff08;‘%’&#xff09;連接存在安全風險&#xff0c;建議使用強密碼并限制訪問IP&#xff0c;或者創建具有必要權限的單獨用戶用于遠程連接。MySQL 配置遠程連接指南 1. 登錄 MySQL 服務器 mysql -…

STM32的 syscalls.c 和 sysmem.c

syscalls.c 是 STM32CubeIDE 自動生成的標準系統調用適配文件&#xff0c;用于裸機環境下支持 newlib 標準庫&#xff08;如 printf, scanf, malloc&#xff09;的運行。這份文件提供了標準庫運行所需的最小系統調用實現。現在我來逐段解析其作用&#xff0c;并補充你可能需要修…

Java零基礎筆記01(JKD及開發工具IDEA安裝配置)

1.Java簡介 Java是一種廣泛使用的計算機編程語言&#xff0c;由美國的Sun Microsystems公司&#xff08;Stanford University Network&#xff09;在1995年推出。Java以其跨平臺、面向對象、安全性高等特點&#xff0c;廣泛應用于企業級應用開發、移動應用開發等領域。2009年&a…

Spark SQL架構及高級用法

Spark SQL 架構概述 架構核心組件 API層&#xff08;用戶接口&#xff09; 輸入方式&#xff1a;SQL查詢&#xff1b;DataFrame/Dataset API。統一性&#xff1a; 所有接口最終轉換為邏輯計劃樹&#xff08;Logical Plan&#xff09;&#xff0c;進入優化流程。 編譯器層&…

【機器學習深度學習】什么是下游任務模型?

目錄 前言 一、什么是下游任務模型&#xff1f; 二、為什么需要下游任務模型&#xff1f; 三、下游任務模型都在干嘛&#xff1f; 四、下游模型怎么訓練出來的&#xff1f; 五、圖解理解&#xff1a;上游 vs 下游 六、一個現實案例&#xff1a;BERT做情感分析 原始數據…

補充:問題:CORS ,前后端訪問跨域問題

補充&#xff1a;問題&#xff1a;CORS &#xff0c;前后端訪問跨域問題 我這邊的解決方法是&#xff1a; myAxios.defaults.withCredentials true; // 配置為true&#xff0c;表示前端向后端發送請求的時候&#xff0c;需要攜帶上憑證cookie整體的&#xff1a; import axio…

洛谷 P13014 [GESP202506 五級] 最大公因數-普及-

題目描述 對于兩個正整數 a,ba,ba,b&#xff0c;他們的最大公因數記為 gcd?(a,b)\gcd(a,b)gcd(a,b)。對于 k>3k > 3k>3 個正整數 c1,c2,…,ckc_1,c_2,\dots,c_kc1?,c2?,…,ck?&#xff0c;他們的最大公因數為&#xff1a; gcd?(c1,c2,…,ck)gcd?(gcd?(c1,c2,……

前端-CSS-day1

目錄 1、初識CSS 2、CSS引入方式 3、標簽選擇器 4、類選擇器 5、id選擇器 6、通配符選擇器 7、畫盒子 8、字體大小 9、字體粗細 10、字體傾斜 11、行高 12、行高-垂直居中 13、字體族 14、font屬性 15、文本縮進 16、文本對齊方式 17、圖片對齊方式 18、文本…

解鎖萬能文件內容提取器:Apache Tika

01 引言 在日常工作中&#xff0c;你是否曾為這些場景頭疼過&#xff1f; 堆積如山的PDF、Word、Excel文檔&#xff0c;如何快速提取關鍵信息&#xff1f;用戶上傳的文件五花八門&#xff0c;如何自動識別類型并安全處理&#xff1f;構建搜索引擎時&#xff0c;如何讓系統“讀懂…

gemini-cli初體驗

目錄 準備配置環境變量運行使用基礎使用配置MCP調用MCP 參考 準備 NodeJS 18版本 配置環境變量 設置GEMINI_API_KEY 變量&#xff0c;在https://aistudio.google.com/apikey創建key 設置代理&#xff08;可選&#xff0c;取決于您的網絡&#xff09;,不配置可能會報錯 api e…

Java --類變量和類方法--main語句

1. 類變量和類方法 介紹&#xff1a; 類變量也叫靜態變量/靜態屬性&#xff0c;是該類的所有對象共享的變量&#xff0c;任何一個該類的對象去訪問它時&#xff0c;取到的都是相同的值&#xff0c;同樣任何一個該類的對象去修改它時&#xff0c;修改的也是同一個變量。 語法…

spring boot項目配置使用minion

一. Minio概述 Minio是一款開源的高性能對象存儲服務,兼容Amazon S3 API,適用于私有云、混合云及邊緣計算場景。它采用分布式架構設計,支持水平擴展,提供數據加密、版本控制、生命周期管理等企業級功能,適用于存儲非結構化數據(如圖片、視頻、日志等)。 核心特性 S3兼…