我猜这是一个哲学问题。
我们正在启动一个视频游戏项目,并在进行过程中发现 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# 和/或视频游戏制作经验的人来说,在这里存储一堆常量的正确方法是什么?