2

我猜这是一个哲学问题。

我们正在启动一个视频游戏项目,并在进行过程中发现 C#。我们需要的第一件事是将常量存储在一堆数组中,以便任何人都可以轻松访问这些值,因此我们可以在定义新角色或武器类型时快速添加或修改值。

现在在 C++ 中,这就是我学会的方法:

  • 在一些 constants.h 文件中声明一个枚举,其最后一个元素是 "WHATEVER_TYPE_END" ;
  • 声明大小为“WHATEVER_TYPE_END”的常量数组,因为枚举和数组索引在 C++ 中运行良好;
  • 在 constants.cpp 中用不同类型的各种值填充这些数组。

一个例子:

enum FoulType {
    FOUL_TYPE_NONE,
    FOUL_TYPE_OUT_OF_PLAY,
    FOUL_TYPE_OFFSIDE,
    FOUL_TYPE_VIOLENCE,
    FOUL_TYPE_RETENTION,
    FOUL_TYPE_END
};

extern const char* FoulTypeNames[FOUL_TYPE_END];

extern const float FoulSanctionChances[FOUL_TYPE_END];

extern const ushort FoulSanctionSeconds[FOUL_TYPE_END];

extern const uchar FoulSanctions[FOUL_TYPE_END];

它很简洁,因为它让程序员可以毫不费力地检索修饰符。如果我想计算我的角色会造成多少伤害,我会做类似的事情

CharacterType charType = myCharacter.getType();
WeaponType weapType = myCharacter.getWeapon().getType();
damage = CharacterDamages[ charType ] * WeaponModifiers[ weapType ];

现在在 C# 中,我一直在努力思考如何获得类似的结果。经过三个小时的游历,我终于有了一些功能性的东西,但它看起来有点骇人听闻。

我拥有的是一个静态类(名为常量),其中声明了公共枚举,并定义了大小为 (int)SomeEnum.END 的公共静态只读数组。声明如下所示:

public enum WeaponType
{
    Gun = 0,
    Shotgun,
    Assault,
    End
};

public static readonly int[] WeapDamage = new int[ (int)WeaponType.End]
{
    10,
    50,
    10
};

由于CS0134 ,数组是只读的而不是 const 。枚举必须显式转换为 int,否则它可以正常工作。现在,我知道那些“常量”并不是真正的常量,这些数组的值可能会改变;对于这个问题,我找到了两种可能的解决方案:

  • 保护数组,并使用 getter,如果有人真的需要整个东西而不仅仅是一个值,则返回数组的副本;
  • 使用 ReadOnlyCollection

由于我偏向于我的旧 C++ 方式(它们本身可能不像我想象的那么干净),这些解决方案都没有吸引我(尤其是 ReadOnlyCollection,因为我(我猜主要是迷信... )害怕时间和/或内存开销(我们正在处理实时多人游戏))。

大多数情况下,我想,我担心我所付出的努力只是为了用另一种语言实现我所知道的几乎像但不完全一样的东西,这只是我做事不正确的迹象。那么,对于比我有更多 C# 和/或视频游戏制作经验的人来说,在这里存储一堆常量的正确方法是什么?

4

2 回答 2

3

它真的必须是常数吗?我的意思是你可以把它包装在一个类中。我不喜欢使用大量依赖于其他常量的常量。您的代码不是很面向对象或可读性。当然,如果内存使用等是一个问题,也有例外。

但是做这样的事情的 C# 方式是做 OO。

public class Weapon {
  public string Name { get; private set; }
  public WeaponType Type { get; private set; }
}

public class WeaponType {
  public string Name { get; private set; }
  public int Damage { get; private set; }
}

等等

然后有一个工厂方法在开始游戏时初始化你的武器/角色等。实际数据可以像文件一样存储在任何地方。

于 2013-03-13T23:30:28.403 回答
1

我建议使用某种“数据存储”:数据库、文本文件、电子表格,无论您喜欢什么,都在启动时加载。这使得测试各种参数组合就像在数据库或文本文件等中编辑一行一样容易,无需重新编译。一旦游戏变得稳定,然后将这些作为资源存储在 EXE 中。

于 2013-03-13T23:09:43.743 回答