我正在尝试决定如何在程序中实现声音效果。我在两个选项之间进行辩论。
1)创建一个抽象接口SoundEffect
,并从中获得每个声音效果。每个声音效果都是它自己的类。在构造时,它打开声音文件并播放,并在销毁时关闭文件。我看到这种方法的主要缺点是我会有很多非常小的对象,这会大大增加文件的数量。我可以在一个标题中放入多个声音效果(相关的声音),但我不确定。
2)由于任何声音效果的播放都调用相同的东西,唯一的区别是它打开的文件,我可以创建一个SoundEffect类,其构造函数是一个包含声音效果名称的枚举器。该课程将使用开关播放适当的声音。
显然我正在讨论OOP方法与更“传统”的方法,我想知道最好的设计选择是什么。我非常倾向于OOP方法,但我不确定我是如何构建文件的。如果您有任何其他建议,我很高兴听到它们。
答案 0 :(得分:2)
声音是数据,播放声音的过程使用大多数机器只有一个的系统资源(声卡)。与声音设备交谈通常有点复杂,但如果使用api,它看起来很简单。
因此,知道如何发挥自己的声音没有多大意义。他们最终会争夺控制作为声音设备的单一资源。
如果必须使用类。那么你应该有一个代表你想要播放的声音设备的类,以及代表可以播放的东西的单独的类。
就个人而言,会跳过用类封装声音效果,数据是数据,实际上也没有必要让每个数据都有方法。过度使用你知道的课程是可能的。
将声音设备包装在类中非常有意义,它允许您从代码的其余部分中抽象出您使用的声音API如何工作的细节,以及本地化允许您使用的代码如果有多个声音设备,请选择使用哪个声音设备。
答案 1 :(得分:0)
如果我明白这一点你正在为所有可能的声音编写声音效果吗?
这听起来不对,您为不同的行为创建了不同的子类,而不是为不同的数据创建 如果您有某些需要预处理数据的声音效果类型,则子类是有意义的 - 如果项目较大,您可能需要分离效果处理代码和效果参数,以便您可以在不重建应用程序的情况下更改效果(例如{{3}分离编码和声音设计)。
要播放不同的声音文件,只需让类的构造函数获取声音文件的路径或某个资源ID即可 - 此处不需要switch
。
如果您正在处理大量重复使用的声音文件,则基于池的方法对于避免每次播放时都重新加载文件非常有用。其中一个成语是flyweight模式(例如,参见FMOD)。