制作包含地图或场景信息的文件,例如要加载的资源、对象、位置、事件

Making files with map or scenario information, such as what resources to load, objects, locations, events

本文关键字:加载 资源 位置 对象 事件 文件 地图 包含 信息      更新时间:2023-10-16

我正在用C++制作一个简单的图形引擎,使用Visual C++和DirectX,并测试不同的地图布局
目前,我只需制作一个C++源文件就可以构建"地图",并开始编写:

SHADOWENGINE ShadowEngine(&settings);
SPRITE_SETTINGS sset;
MODEL_SETTINGS mset;
sset.Name = "Sprite1";
sset.Pivot = TOPLEFT;
sset.Source = "sprite1.png";
sset.Type = STATIC;
sset.Movable = true;
sset.SoundSet = "sprite1.wav"
ShadowEngine->Sprites->Load(sset);
sset.Name = "Sprite2"
sset.Source = "sprite2.png";
sset.Parent = "Sprite1";
sset.Type = ANIMATED;
sset.Frames = 16;
sset.Interval = 1000;
sset.Position = D3DXVECTOR(0.0f, (ShadowEngine->Resolution->Height/2), 0.0f);
ShadowEngine->Sprites->Load(sset);
mset.Source = "character.sx";
mset.Collision = false;
mset.Type = DYNAMIC;
ShadowEngine->Models->Load(mset);
//Etc..

我希望能够做的是创建映射文件,这些文件被加载到引擎中,而不必将它们写入可执行文件中。这样,我就可以对地图进行更改,而不必每次都重新编译。

SHADOWENGINE ShadowEngine(&settings);
ShadowEngine->InitializeMap("Map1.sm");

我能想到的唯一方法是让它以文本形式读取文件,然后解析信息,但这听起来很麻烦。

我是不是想错了?我该怎么办?

我不介意解释一下其他人是怎么做的,比如《魔兽争霸III》、《星际争霸》、《帝国时代》、《强权英雄》和《魔法英雄》。。。

非常感谢您在这方面的帮助。

您没有想错,加载地图数据绝对是可取的。最常见的预构建解决方案是协议缓冲区和Lua。如果你还不知道Lua,我会使用协议缓冲区,因为它直接解决了你的问题,而Lua是一种脚本语言,它足够灵活,可以做你需要做的事情。

有些人将数据写成XML,但这只是部分解决方案,因为XML只是一种标记语言。加载XML后,您将有一个DOM树进行解析。

谷歌的CPP Protobuf教程