第三章:创建类库

内容介绍

主要内容:创建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兼…