当前位置: 首页 > news >正文

从零开发游戏需要学习的c#模块,第十六章(安装 MonoGame 并创建第一个窗口)

关于c#的基本内容我们差不多学完了,接下来我们来学习安装monogame并创建第一个窗口。

第一步:安装 MonoGame 模板

  1. 打开Visual Studio Installer(开始菜单搜一下就有)

  2. 找到你安装的 Visual Studio 版本,点击修改

  3. 在右侧找到“游戏开发”或直接搜“游戏”

  4. 勾选“使用 C# 的游戏开发”(或者c++的游戏开发)这个工作负荷

  5. 点击右下角修改,等待安装完成

安装完成后,打开 Visual Studio。

第二步:创建第一个 MonoGame 项目

  1. 在 Visual Studio 里点击创建新项目

  2. 在搜索框里输入MonoGame

  3. 选择MonoGame Cross-Platform Desktop Application(不是 Android/iOS 的)

  4. 项目名称写MyFirst2DGame,选好位置,点创建

如果无法搜索到,请使用备用方案

用命令行装模板(备选方案):如果VS里搜不到那个插件,或者安装了还是没用,可以打开命令行(CMD或PowerShell),输入下面这行代码然后回车,它会直接把模板文件安装到你的电脑里:
dotnet new install MonoGame.Templates.CSharp

第三步:了解项目结构

创建完后你会看到以下文件:

文件作用
Game1.cs游戏主类,核心逻辑都在这里
Program.cs启动入口(和之前一样)
Content文件夹存放图片、音效、字体等资源

第四步:看Game1.cs的结构

打开Game1.cs,你会看到这些你非常熟悉的东西:

protected override void Initialize()
{
// 初始化游戏数据(你之前的 Start())
base.Initialize();
}

protected override void LoadContent()
{
// 加载图片、音效(你之前的 LoadGame())
}

protected override void Update(GameTime gameTime)
{
// 每帧更新逻辑(你之前的 Update())
// gameTime 里有 deltaTime,相当于你的 Thread.Sleep(30)
}

protected override void Draw(GameTime gameTime)
{
// 每帧渲染画面(你之前的 Render())
}

第五步:画出第一个东西——红色方块

在game里替换

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace MyFirst2DGame
{
public class Game1 : Game
{
private GraphicsDeviceManager _graphics;
private SpriteBatch _spriteBatch;

// 玩家相关
private Texture2D playerTexture; // 玩家的纹理(图片)
private Vector2 playerPosition; // 玩家的位置
private int playerSpeed = 200; // 移动速度

public Game1()
{
_graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
}

protected override void Initialize()
{
// 设置窗口大小
_graphics.PreferredBackBufferWidth = 800;
_graphics.PreferredBackBufferHeight = 600;
_graphics.ApplyChanges();

// 玩家初始位置:屏幕中央
playerPosition = new Vector2(400, 300);

base.Initialize();
}

protected override void LoadContent()
{
_spriteBatch = new SpriteBatch(GraphicsDevice);

// ★ 创建一个 1x1 的白色纹理,然后染色成红色
playerTexture = new Texture2D(GraphicsDevice, 1, 1);
playerTexture.SetData(new[] { Color.White });
}

protected override void Update(GameTime gameTime)
{
// 获取键盘状态
KeyboardState keyboard = Keyboard.GetState();

// 移动速度 * 帧时间 = 每秒移动固定距离
float speed = playerSpeed * (float)gameTime.ElapsedGameTime.TotalSeconds;

if (keyboard.IsKeyDown(Keys.W) || keyboard.IsKeyDown(Keys.Up))
playerPosition.Y -= speed;
if (keyboard.IsKeyDown(Keys.S) || keyboard.IsKeyDown(Keys.Down))
playerPosition.Y += speed;
if (keyboard.IsKeyDown(Keys.A) || keyboard.IsKeyDown(Keys.Left))
playerPosition.X -= speed;
if (keyboard.IsKeyDown(Keys.D) || keyboard.IsKeyDown(Keys.Right))
playerPosition.X += speed;

// ESC 退出
if (keyboard.IsKeyDown(Keys.Escape))
Exit();

base.Update(gameTime);
}

protected override void Draw(GameTime gameTime)
{
// 清屏为深蓝色
GraphicsDevice.Clear(Color.CornflowerBlue);

// 开始画东西
_spriteBatch.Begin();

// ★ 画一个 50x50 的红色方块代表玩家
Rectangle playerRect = new Rectangle(
(int)playerPosition.X - 25,
(int)playerPosition.Y - 25,
50, 50
);
_spriteBatch.Draw(playerTexture, playerRect, Color.Red);

_spriteBatch.End();

base.Draw(gameTime);
}
}
}

第六步:运行

F5,你会看到:

  • 一个 800x600 的深蓝色窗口

  • 一个 50x50 的红色方块在屏幕中央

  • WASD方向键移动方块

  • ESC退出

注意:program改为

using var myGame = new MY_FIRST_GAME.Game1(); myGame.Run();

保证程序能够正常运行

好了,今天的课程到此结束,关注我,下期更精彩

http://www.jsqmd.com/news/854001/

相关文章:

  • 语音控制模组定制常见问题解答(2026最新专家版) - 资讯速览
  • 【数据库实战】手把手部署SQL Server 2022:从镜像到SSMS的完整避坑指南
  • 保姆级教程:在Ubuntu 20.04上搞定TDA4VM的Linux+RTOS双系统编译与镜像更新
  • 20252223 《Python程序设计》大实验报告
  • 别再死记硬背了!用这5个jQuery实战小项目(含源码)搞定educoder实训作业
  • 2026年工业自动化维修行业GEO优化服务商适配指南与能力评估 - 产业观察网
  • 2026合肥黄金回收价格多少钱一克?附近黄金回收靠谱商家推荐。 - 资讯速览
  • 2026广州制作小程序公司排名:如何选择最适合你的那一款?
  • 浩卡联盟官方邀请码到底是啥?全网佣金置顶0抽成邀请码16888注册一级 - 流量卡代理招商
  • 杭州配眼镜避坑实录:拆解猿目眼镜的“全周期视光服务”新标准 - 资讯速览
  • 2026年国内干细胞机构避坑指南:干细胞公司制备中心研究所TOP5权威发布 - 资讯快报
  • CDN 地域节点优化:匹配 GEO 信号,提升加载速度
  • 2026年沥青搅拌设备与厂拌热再生设备深度选购指南:铁拓机械等品牌核心优势与避坑全解析 - 资讯快报
  • 抖音小程序开发要多少钱?3种低成本方案对比!
  • ViLBERT:从单模态到多模态,Transformer如何打通视觉与语言的“任督二脉”?
  • 从‘办事查询’案例出发:手把手教你用Vue2+Swiper5封装一个高复用性轮播组件
  • 2026年全球沥青搅拌设备与厂拌热再生技术选购指南:铁拓机械等主流方案深度对比 - 资讯快报
  • 从网络传输到硬盘存储:CRC校验码的‘一位纠错’功能到底用在哪?
  • Linux服务器DNS配置实战:基于BIND 9搭建内网权威与缓存解析服务
  • 在TaoToken平台使用TokenPlan套餐后月度API成本显著下降的观察
  • 2026 年广州 GEO 优化服务商大盘点:五家头部企业实力测评与选型策略 - GEO优化
  • 告别杂乱教程:手把手教你用VSCode+MicroPython点亮ESP32-S3-WROOM-1
  • 2026铸铝门厂家五大品牌权威排名|高端别墅门优选榜单 - 门业测评
  • 施耐德M340/M580 PLC仿真器:从基础配置到高级通信仿真的实战指南
  • 别再乱加偏置了!手把手教你搞定单/双电源运放的直流偏置(附Multisim仿真避坑)
  • 2026年鄂尔多斯市潍柴原装发电机组厂家最新推荐 - 品牌推广大师
  • Mac新手必看:用Homebrew安装FFmpeg,我踩过的那些坑都帮你填平了
  • DeepSeek-R1/DW系列模型下载安装实战:从Hugging Face镜像加速到vLLM推理优化,手把手教你30分钟跑通首个Demo
  • 告别开机慢和数据丢失:为你的RK3588 Android设备优化Data分区(关闭加密+换文件系统)
  • 2026年昆明市金表回收机构推荐top榜单 - 品牌推广大师