У меня есть фрагмент кода для видеоигры, который обновляет усиление музыкального цикла в зависимости от того, насколько далеко игрок находится от задней двери. РЕДАКТИРОВАТЬ. Этот код обновлен с помощью GainControl в качестве переменной экземпляра и с фиксированным значением усиления.
public void updateMusic()
{
int endX = currentMap.getEndPointX() * TILE_WIDTH;
int endY = currentMap.getEndPointY() * TILE_HEIGHT;
double dist = Math.hypot(endX - playerX, endY - playerY);
if(dist < 300)
{
double gain = 600 / dist;
gainControl.setValue(Math.min(0, Math.max(gainControl.getMinimum(), (float) (-22 + gain))));
}
else
{
gainControl.setValue(-20f);
}
}
Усиление звука обновляется, но очень прерывисто. У меня есть цикл, который обновляет его 10 раз в секунду, но вместо постоянного обновления он внезапно случайным образом скачет/падет. Есть ли способ заставить аудиосистему обновиться? Или это неправильный способ создания такого динамического звука?
Изменить. Вот другие методы, которые я использую, а также соответствующие объявления переменных вверху
Clip runningClip;
Clip walkingClip;
Clip raveLoop;
FloatControl gainControl;
private AudioInputStream audioStream;
private Clip playSound(String soundName)
{
File file = new File("src/ninja/sounds/" + soundName + ".wav");
try
{
audioStream = AudioSystem.getAudioInputStream(file);
Clip clip = AudioSystem.getClip();
clip.open(audioStream);
clip.start();
return clip;
}
catch(IOException | UnsupportedAudioFileException | LineUnavailableException error)
{
error.printStackTrace();
}
return null;
}
private void startMusic()
{
raveLoop = playSound("bass_rave_loop");
raveLoop.loop(Clip.LOOP_CONTINUOUSLY);
gainControl = (FloatControl) raveLoop.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(-20.0f);
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... nd-updates