将枚举的存在与其特定内容分开

时间:2011-09-13 06:16:41

标签: c# enums game-engine

我正在编写一个游戏引擎的音频管理器,我想保持它的通用性,以便不同的游戏可以使用相同的引擎。现在我使用Dictionary<string,SoundEffect>来存储声音和它们相关的事件。我更愿意使用Enum作为密钥,因为它会带来许多好处。现在,有人可以AddSound("Explosion", explosionSound)和我们团队中的另一位程序员PlaySound("ExplosionSpelledWrong")等等。

我希望音频管理器引用“SoundEvent”enum。我的问题是这个枚举的内容将是游戏特定的。有些游戏可能有:

enum SoundEvent {    
    Explosion,
    GameOver
}

另一个可能有

enum SoundEvent {    
    Jump,
    Laser
 }

等等。

请注意,我不需要在音频管理器中引用枚举的内容,因为它只是字典中的一个键 - 特定的SoundEvent将始终在游戏特定的项目中指定

那么如何将我的引擎与游戏特定项目分开?我不想在音频管理器中引用任何特定于游戏的内容。

我想到的第一件事就是制作一个namespace GameSpecificEnums,它仍然是Engine项目的一部分并将它们放在那里。但是,为了制作不同的游戏,人们必须改变引擎项目的这一部分。在现实中这不是什么大问题,但它并不合适。

我的另一个想法是将词典更改为Dictionary<int,SoundEffect>,然后在特定游戏代码中使用此类词:

static class SoundEvent {
    private const int Explosion = 0;
    private const int Laser     = 1;
    // etc.
}

然后使用以下内容调用音频管理器:

AudioManager.Add(SoundEvent.Explosion, explosionSound);

但这也感觉不对,因为有人可以AudioManager.PlaySound(2112)

还有其他解决方案吗?

1 个答案:

答案 0 :(得分:2)

听起来你可能希望在密钥类型中使AudioManager通用。您可以不受任何限制地执行此操作,或者您可以尝试将其约束为枚举。对于“普通”C#,这是不可行的,但我有一个名为Unconstrained Melody的项目,它通过IL重写完成它。这可能是一种矫枉过正 - 你总是可以将密钥类型约束为struct,并希望每个人都能正确使用它。

然后,您的PlaySound方法会使用TKey等类型的密钥。