举个例子,我将使用libgdx(游戏引擎),但这是一个关于java如何工作的问题,我找不到。
这是soundControler类:
private final Sound s_0 = Gdx.audio.newSound(Gdx.files.internal("a.mp3"));;
private final Sound s_1 = Gdx.audio.newSound(Gdx.files.internal("a.wav"));
//lot of more variables
public void shoot(short sound){
if(SOUND_ENDABLED) {
switch (sound) {
case 0:
s_0.play();
break;
case 1:
s_1.play();
break;
}
}
}
所以这基本上是一个加载在内存中的声音库,程序将不断使用它。
另一个例子:
假设我们有一个Animator
类,它将为游戏中的每个动画提供大量方法。
这是一个好习惯吗?或者,每当我将soundControler
作为参数传递时,我是否会在内存中制作所有声音和方法的新副本?
答案 0 :(得分:1)
当你将声音控制器作为参数"但是当你实例化一个实例时,我不认为问题是"每次实例化实例时,您都会调用这些方法。有必要吗?
如果你将变量设为静态,那么代码只会在实例化类时执行,即一次运行程序(实际上是为该类加载器执行实例化,但对于大多数用途来说,运行一次)该程序)。如果它们在第一次设置后永远不会改变,那么它们可以是静态的,没有不良影响。
你没有问,但我还是会对此发表评论 - 我不明白为什么你(以及其他许多人)使用案例陈述来代替数组。把声音放在一个数组中(或者一个hashmap,如果你实际上没有方便的整数来索引一个数组);然后使用sound
变量简单地索引到该数组中,然后就完成了。您的代码更短,更容易理解,并且运行速度至少一样快。
未编译的示例:
private static Sound[] allSounds;
private static String[] allSoundFiles
= { "a.mp3", "a.wav" /* ... * };
static
{
allSounds = new Sound[allSoundFiles.length];
index = 0;
for (String s:allSoundFiles)
{
allSounds[index] =
Gdx.audio.newSound(Gdx.files.internal(s);
}
}
public void shoot(short sound)
{
if (SOUND_ENABLED) // or ENDABLED if you prefer
{
allSounds[sound].play();
}
}
唯一增加声音的是文件名列表。这假设您加载的所有声音当然都具有play()
功能。