第四章:内容管道与纹理的使用
主要内容:
本章会讲述内容管道的概念以及如何再窗口中渲染一张照片或者(纹理),本章内容较为简单,但是也很重要为之后的章节做好铺垫,这个内容管道也能让你知道游戏引擎加载底层代码的逻辑是什么,好了多的不说了接下来我们正式开始课程
内容管道:
再MonoGame当中内容管线是一个很重要的东西,它能够帮助你加载资源,加载配置文件等等等,如果创建好项目之后,我们可以发现再VSCode的左上角会有一个,MonoGame的小Logo,就是那个白亮色加粗的MonoGame的LOGO
点击这个按钮之后我们就能进入MonoGame的内容管道了,内容管道有啥用呢,很简单就下面这一个功能:
- 管理游戏资源(图片,模型,素材文件等)
- 管理游戏配置文件
这个其实很简单,你可以再内容管道中创建以下内容:
- 新文件夹(分类文件)
- 已存在文件 (导入已存在文件)
- 新建文件 (新建一个配置文件/其他文件)
还有其他功能没有发掘,但是这个内容管道主要使用的内容也就只有这些,主要就是为了更加方便地访问图片资源,配置文件等内容
MonoGame内容管道操作:
那么我们该怎么使用这个MonoGame自带地内容管道呢?
很简单我们右键 Projects方框中的Content图标,然后就会出现以下列表:
这边把鼠标移动到 -> Add 上会出现以下四个选项:
- New Item (创建新文件)
- New Folder (创建新的文件夹)
- Existing Item (导入本机已存在地文件)
- Existing Folder (导入本机已存在地文件夹)
OK接下来我们试一下,上面这张照片是我们游戏所需要地游戏素材照片(如果画质有缩减可以去我的Gitee仓库下载,同样的Gitee仓库里也有完整代码和项目所需音频)
第一步:创建一个images文件夹
我们右键Content,创建一个新的文件夹New Folder如下图所示
当然了这个名字大家可以自己取,你们可以取:Images或者IMAGES 这个看个人,但是你们要记住这个文件夹你们取得啥名得有个印象,然后我们再右键导入一个已经存在的Item,就像这样,记住是Existing Item,然后导入刚才你在这个上下载的图片,(如果有水印的,或者画质很糊的前往我的Gitee仓库下载或者前往官方网站下载,我推荐是前往我的仓库下载,因为MonoGame的官方网站很碎我直接把素材的最终版给你,上面那个素材就已经能做出完整游戏了,如果需要音效的话我的Gitee仓库同样是有的)
接着我们导入刚才的照片就像这样,照片的名字也取个好打的
这里他会弹出这个窗口提示你需要以什么样的方式在此添加这个文件:
这里我们直接选择我第一个Copy the file to the directory,将文件复制到该内容管道当中。
OK最后我们看一下添加文件后的效果是什么:
,当然大家别忘了保存了有两种方法保存你的修改:
- Ctrl + S (万用保存手段)
- File -> Save
这样我们就在内容管道中添加了一个内容了,我们干了那些事呢:
- 理解内容管道
- 在内容管道中添加资源
OK 接下来我们介绍如何在屏幕中渲染一张图片
渲染图片:
还记得我们上一节课创建的GameMain 代码吗,我们接下来创建一个纹理,并且在窗口中渲染出来,下面是完整代码:下面我说的很重要:
下面的代码分别在10 25 44 47 50部分做了调整主要完成了纹理加载,纹理渲染两个步骤
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using SlimeGameLibrary;
namespace SlimeGame;
public class GameMain : Core
{
private Texture2D texture;
public GameMain() : base("SlimeGame", 1280, 720, false)
{
}
protected override void Initialize()
{
// TODO: 增加你的初始化逻辑
base.Initialize();
}
protected override void LoadContent()
{
texture = Content.Load<Texture2D>("images/atlas");
}
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: 增加你的渲染环境
SpriteBatch.Begin();
SpriteBatch.Draw(texture, Vector2.Zero, Color.White);
SpriteBatch.End();
base.Draw(gameTime);
}
}
private Texture2D texture; // 声明纹理
texture = Content.Load<Texture2D>("images/atlas"); // 在LoadContent函数中调用加载资源
SpriteBatch.Begin(); // 在Draw函数中调用开始渲染材质
SpriteBatch.Draw(texture, Vector2.Zero, Color.White); // 在Draw中调用渲染过程
SpriteBatch.End(); // 在Draw中调用结束渲染材质
这上面这段代码博主推荐大家尽量自己打一遍有个印象,这个以后我们把他封装起来大家也好理解
然后我们老套路运行程序
cd 你的项目名称
dotnet run
运行结果应该是这样的,如果大家没有错的话,那么天的课程大家就都完成了,那么接下来我给大家渲染纹理函数的封装,大家完成一个小作业
SpriteBatch.Draw(
texture, // 纹理
new Vector2(), // 渲染位置
null, // 是否切割,切割范围
Color.White, // 颜色渲染
0.0f, // 旋转角度
Vector2.Zero, // 核心偏移量
1.0f, // 放大
SpriteEffects.None, // 水平翻转或者垂直翻转
0.0f // 层级渲染
);
SpriteEffects.None (无)
SpriteEffects.FlipHorizontally (水平翻转)
SpriteEffects.FlipVertically (平面效果.垂直翻转)
# 颜色
例如:
Color.White * 0.5 (在原色系的基础上减少50%的透明度)
如何把这个纹理素材渲染到屏幕中间?
结语:
这是暑假以来更新的第三篇文章了,继续加油,今天的内容比较简单,但是不代表不重要,今天去体检了,当然了主包的体检包过了,好想实战开车啊啊啊啊,明天会再更一篇,明天的代码量比较大,也比较重要,部分代码可以直接复制,但是我希望你能看的懂这个代码,明天就要开始写游戏引擎最基本的框架部分了:图集,精灵,精灵动画类Ok了接下来我们照例考大家几个问腿: