gpt4 book ai didi

C# Monogame - 从文件加载关卡

转载 作者:行者123 更新时间:2023-11-30 14:09:00 33 4
gpt4 key购买 nike

我正在构建一个 2D 平台游戏。但是制作视频的人只是展示了如何创建 map 和图 block 类并从他制作的数组中加载关卡。我听说这是一种不好的做法,人们应该从文件中加载关卡...我知道如何使用流阅读器加载文件,但由于那不是我的代码,所以我一直在按照教程进行操作,但在实现它时遇到了困难。

所以这是我的关卡代码:

private Map map;

// This is in my LoadContent() method
map.Generate(new int[,]
{
{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
{2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 2, 2},
{2, 2, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 2, 2},
{2, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 2, 2},
{2, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2},
{2, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
{2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
}, 64);

所以我像这样加载图 block :

// Tiles.cs class
public CollisionTiles(int i, Rectangle newRectangle)
{
texture = Content.Load<Texture2D>("Graphics/Tiles/tile_" + i);
this.Rectangle = newRectangle;
}

上面的每一个整数都被添加到文件名的字符串中,并直接加载并绘制在屏幕上(像这样:map.Draw(spriteBatch);)。 64 int 是绘制实际图 block 的大小。这就是我想要避免的,必须为每个级别编写这些数组,而不是我需要一种从文件加载级别的方法。加载关卡的图 block 时,不应忘记 .txt 文件中的图 block 大小。也许让它单独留在关卡文件的第一行或最后一行?这样,如果需要,每个级别都可以有不同大小的图 block 。

这是我的 Map.csTiles.cs类。我没有直接将它们粘贴到 SO 上,这会使问题太长......

那么您将如何处理这个问题?什么样的解决方案最好?我认为加载级别类似于这样的图 block :"Levels/level_"+ i 也是我的好方法,每次玩家完成时让游戏增加 int i一个级别(我自己应该可以做到),但我只是问你如何阅读文件。我将对我的代码进行任何建议的修改,而且我认为 Split 通过 调整文件内容是基于意见的,也可以使用空格 ,但由于这是类中的一个数组,我不得不使用 ,s。在文本文件中,我还应该删除 { } 大括号。无论如何,我感谢您的任何反馈和带有解释的代码示例会很棒!

编辑:那么我应该像这样将图 block 添加到 collisionTiles 吗?

public int[,] LoadLevelData(string filename)
{
using (var streamReader = new StreamReader(filename))
{
var serializer = new JsonSerializer();
Generate((int[,])serializer.Deserialize(streamReader, typeof(int[,])), 64);
return (int[,])serializer.Deserialize(streamReader, typeof(int[,]));
}
}

最佳答案

So how would you approach this? What kind of solution is best?

这个问题的最佳解决方案实际上取决于您打算如何编辑您的关卡。

使用您当前的方法(在代码中存储关卡数据),您实际上可以手动编辑关卡。这并不壮观,但对于小型游戏来说是可以管理的。

下一个方法是将级别存储在文本文件中。我 answered a similar question关于这个前几天。过去许多游戏都使用这种方法并取得了巨大成功。

如果你想让事情变得非常简单,你可以使用你现在获得的数据并使用 JSON.NET反序列化它。很酷的是,以 JSON 表示的数据看起来几乎与在代码中显示的完全一样,并且可以使用您喜欢的文本编辑器进行编辑。

[
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 2, 2],
[2, 2, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 1, 0, 0, 0, 0, 2, 2],
[2, 2, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 2, 2],
[2, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 2, 2],
[2, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
]

加载方法也很简单。

    public int[,] LoadLevelData(string filename)
{
using (var streamReader = new StreamReader(filename))
{
var serializer = new JsonSerializer();
return (int[,])serializer.Deserialize(streamReader, typeof(int[,]));
}
}

要使用该方法,您可以将结果传递给您的Generate 方法:

    // This is in my LoadContent() method
var levelData = LoadLevelData(filename);
map.Generate(levelData, 64);

如果您始终使用大小为 64 的 block ,那将很好地工作,但是,如果您愿意,您也可以将 block 大小存储在 JSON 文件中。虽然它有点复杂,但对于这个答案来说可能太多了。 JSON.NET 库有 excellent documentation .

由于您使用的是 MonoGame,因此您可能想要使用 TitleContainer.OpenStream而不是 StreamReader 来保持所有平台上的工作。或者,您可以 write a content reader对于 MonoGame Pipeline tool但这超出了这个问题的范围。

最后但同样重要的是,您可能要考虑使用第 3 方级别的编辑器软件,如 Tiled .我的 MonoGame.Extended 中有一个很棒的 Tiled map 加载器图书馆或其他一些 existing map loaders可供选择。

无论您选择哪种方法,我的建议都是让事情保持简单。每种方法都有利有弊,简单的解决方案通常最容易上手。一旦掌握了基础知识,您就可以升级到复杂的方法以获得更多好处。

关于C# Monogame - 从文件加载关卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32159439/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com