#java #eclipse #background-music
#java #eclipse #фоновая музыка
Вопрос:
У меня есть этот код для воспроизведения музыки (найден в Интернете):
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
public class MusicBackground {
public static void main(String[] args) throws Exception {
URL url = MusicBackground.class.getResource("backgroundMusic.wav");
AudioClip clip = Applet.newAudioClip(url);
clip.play();
Thread.sleep(1000);
clip.loop();
}
}
Это прекрасно работает само по себе. Но дело в том, что после того, как я внедрил это в свою игру, она либо воспроизводит музыку, когда я запускаю музыкальный класс, либо, когда я запускаю всю игру, она запускает игру без музыки. Вот мой класс загрузки для моей игры:
import static helpers.Artist.BeginSession;
import org.lwjgl.opengl.Display;
import helpers.Clock;
import helpers.StateManager;
public class Boot {
public Boot() {
//Call static method in Artist class to initialize OpenGL calls
BeginSession();
//Main game loop
while (!Display.isCloseRequested()) {
Clock.update();
StateManager.update();
Display.update();
Display.sync(60);
}
Display.destroy();
}
public static void main(String[] args) {
new Boot();
}
}
Я знаю, что класс музыкального фона находится в общедоступном static void main. Но как мне реализовать это в классе boot?
Комментарии:
1. Вероятно, вам нужно скопировать / вставить 5 строк из вашего музыкального кода в ваш класс загрузки. Возможно, вам также потребуется запустить этот код в отдельном потоке. Вы можете создать метод в своем классе boot, скажем, private static void PlayMusic() {} и вызвать его в своем основном методе после / перед вашим новым вызовом Boot().
Ответ №1:
Измените свой класс фоновой музыки, чтобы реализовать runnable:
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
import java.lang.Runnable;
public class MusicBackground implements Runnable {
public void run() throws Exception {
URL url = MusicBackground.class.getResource("backgroundMusic.wav");
AudioClip clip = Applet.newAudioClip(url);
clip.play();
Thread.sleep(1000);
clip.loop();
}
}
Затем вы можете создать поток для фоновой музыки в главном потоке вашей игры. Если вы просто направите вызов или вставите этот код фоновой музыки в основной игровой цикл, то вызов .sleep переведет всю программу в спящий режим (поскольку в настоящее время это один поток). Итак, вот как теперь будет выглядеть ваш основной метод:
import static helpers.Artist.BeginSession;
import org.lwjgl.opengl.Display;
import helpers.Clock;
import helpers.StateManager;
public class Boot {
public Boot() {
//Call static method in Artist class to initialize OpenGL calls
BeginSession();
Thread backgroundPlayer;
Try {
backgroundPlayer = new Thread(new MusicBackground());
backgroundPlayer.start();
}
catch(Exception e)
{
System.out.println("Problem firing the background thread");
e.printStackTrace();
}
//Main game loop
while (!Display.isCloseRequested()) {
Clock.update();
StateManager.update();
Display.update();
Display.sync(60);
}
Display.destroy();
}
public static void main(String[] args) {
new Boot();
}
}
Комментарии:
1. Большое вам спасибо! Люблю тебя!