在 Eclipse 上按 'run' 时无法启动游戏和音乐(同时)
Trouble launching game and music (at the same time) when pressing 'run' on 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();
}
}
单独使用效果很好。但问题是,在我将它实现到我的游戏中之后,它要么在我启动音乐时播放音乐 class,要么在我 运行 整个游戏时播放音乐,它 运行s没有音乐的游戏。这是我的游戏引导 class:
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();
}
}
我知道音乐背景 class 在 public static void main.但是我如何将它实现到引导中 class ?
更改背景音乐class以实现可运行:
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();
}
}
我有这个播放音乐的代码(网上找到的):
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();
}
}
单独使用效果很好。但问题是,在我将它实现到我的游戏中之后,它要么在我启动音乐时播放音乐 class,要么在我 运行 整个游戏时播放音乐,它 运行s没有音乐的游戏。这是我的游戏引导 class:
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();
}
}
我知道音乐背景 class 在 public static void main.但是我如何将它实现到引导中 class ?
更改背景音乐class以实现可运行:
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();
}
}