我有一个小程序,基本上向用户提示问题,阅读答案,检查其有效性等等,直到完全执行RPG角色的创建。我迅速得到了几个课程,每个课程都与一堆要存储的信息有关。
我的问题是:存储这些消息的最佳方式是什么?
我的第一个(也是肮脏的)尝试是使用单个文件messages.hpp:
namespace M
{
string const message1("what's your name ?");
// + many others
}
但由于许多类依赖于此文件,因此对其进行的任何微小更改都意味着编译时间非常长。
因此,为了重新分发消息,我想将相关消息作为需要它们的类的静态成员包含在内,但我发现它破坏了我的类头的可读性。所以我在徘徊:我可以在类中创建一个子名称空间,它将是一个像这样的消息收集器:
// monster.h
class Monster
{
// members and methods declared here
};
namespace Monster::Messages
{
string const message1("what's your name ?");
// + others messages only used by Monster
}
并且可能像这样使用:
// monster.cpp
Monster::Monster()
{
cout << Messages::message1 << endl;
}
然而,我想知道:
Monster::messages
的每个实例复制Monster
的所有邮件?Monster::messages
的所有邮件复制到所有文件中,包括monster.hpp
(静态链接)? Monster
中的消息是否被视为成员,静态成员或非成员? static
关键字,会发生什么情况
它具有静态链接或静态成员的意义吗?当然:这是不好的做法吗?有巧妙的方法吗?
答案 0 :(得分:4)
在我看来,最佳做法是将所有这些数据信息存储在游戏的外部数据文件中。
我将为您提供这样做的一些好处:
代码更清晰明亮。
即使不编译二进制文件,也可以实现对数据游戏的少量修改。这对于那些必须进行测试的数据参数非常重要,每次更改值时,您必须运行游戏以查看所有副作用。 (例如关于怪物健康,伤害,GUI位置等的一些参数......)。通过这种方式,测试阶段不需要再次编译二进制文件,而且速度更快。
允许其他游戏开发者轻松修改游戏参数。例如,团队中那些不是程序员的人。
允许轻松修改游戏数据而无需更改代码中的设计。例如,假设两年后你的游戏变得非常受欢迎,并且你想用多种语言翻译它以获得更多用户。如果所有这些数据都嵌入到代码中,您应该重新设计和修改代码,也许更重要的是,能够完成这项工作的人只有您,因为只有您拥有访问权限和代码知识。在另一种情况下(当数据存储在外部文件中时),更多人可以轻松访问和升级您的游戏。
如何实现这一程序可能是SO的另一个问题,但有几种选择。
例如,您可以创建一个独特的巨大文件(这意味着一些智能技巧,特别是出于性能原因),或者您可以将数据参数分发到多个文件中。 因此,您的游戏将具有加载的阶段,其中从磁盘读取数据(几乎所有其他游戏)。
此外,您应该考虑(如果需要)一种方法来加密这些文件并避免游戏用户修改它们。