加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#Monogame – 从文件加载级别

发布时间:2020-12-16 09:58:50 所属栏目:百科 来源:网络整理
导读:嘿家伙我是Monogame的新手,所以我在网上关注一些教程.我正在构建一个2D平台游戏.但制作视频的人只是展示了如何创建地图和平铺类,并从他制作的数组中加载了关卡.我听说这是一个不好的做法,人们应该从文件中加载他们的级别……我知道如何使用流式读取器加载文
嘿家伙我是Monogame的新手,所以我在网上关注一些教程.我正在构建一个2D平台游戏.但制作视频的人只是展示了如何创建地图和平铺类,并从他制作的数组中加载了关卡.我听说这是一个不好的做法,人们应该从文件中加载他们的级别……我知道如何使用流式读取器加载文件,但由于那不是我的代码,我正在按照教程进行操作并且我很难实现它.

所以这是我对关卡的代码:

private Map map;

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

所以我正在加载这样的瓷砖:

// 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是实际切片绘制的大小.这就是我想要避免的,必须为每个级别编写这些数组,而我需要一种从文件加载级别的方法.加载关卡的切片时,不应忘记.txt文件中的切片大小.也许让它独自留在关卡文件的第一行或最后一行?这样,如果需要,每个级别可以具有不同大小的区块.

这是我的Map.cs和Tiles.cs课程.我没有将它们直接贴在SO上,这会让问题太长了……

那你怎么看待这个呢?什么样的解决方案最好?我认为加载级别类似于这样的牌:“Levels / level_”我也是我很好的方式,每次玩家完成一个等级时我都会让游戏增加int我(我应该能够自己做),但我我只想问你怎么读文件.我将对我的代码进行任何建议的修改,并且我认为拆分文件的内容,基于意见,也可以使用空格,但因为这是我必须使用的类中的数组,s.在文本文件中,我还应该删除{}大括号.无论如何,我感谢你的任何反馈和代码示例与解释将是伟大的!

编辑:
那么我应该像这样将贴图添加到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[,]));
            }
        }

解决方法

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

解决此问题的最佳方法实际上取决于您计划编辑关卡的方式.

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

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

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

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

加载方法也很简单.

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

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

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

如果您总是使用64块大小,那么这样就可以了.但是,如果您愿意,也可以将块大小存储在JSON文件中.虽然这有点复杂,但对于这个答案来说可能太多了. JSON.NET库有excellent documentation.

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

最后但并非最不重要的是,你可能想要考虑的是使用第三方级编辑器软件,如Tiled.我的MonoGame.Extended库中有一个很棒的Tiled地图加载器或其他一些existing map loaders可供选择.

无论你选择什么方法,我的建议是保持简单.每种方法都有优点和缺点,简单的解决方案通常是最容易上手的.一旦掌握了基础知识,您就可以升级到复杂的方法以获得额外的好处.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读