第三章:创建类库
内容介绍
主要内容:创建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了,接下来我们创建这个类库已经创建好了,基本就是这么一个流程,大家知道一个大概的框架,这部分代码大家可以直接搬走,但是建议大家那个单例模式部分的内容再敲一次记住这个形式的,单例模式算是游戏开发中非常重要的内容了
结语:
这次文章就写到这里,暑假到了我会全力更新这个系列,争取暑假前更新,大家不要急我每篇文章都会尽力创建的,我也要开始学车了嘻嘻嘻,大家一起进步分享技术这个也是我写博客的初衷,大家一起分享技术谢谢大家。
接下来还是照例问大家几个问题: