Ich weiß, das wurde oft gefragt, aber es ist in einigen Szenarien anders, so dass ich es nicht herausfinden kann. Wenn ich mein Spiel in Eclipse starte, läuft alles reibungslos und das Spiel läuft einwandfrei, aber nachdem ich es exportiert habe, bricht es zusammen. Ich kann das Spiel öffnen und im Menü herumlaufen, aber keine Sounds spielen und nachdem ich Play gedrückt habe, friert das Spiel einfach ein und es gibt mir diesen Fehler mit cmd (Ich kann jede Klasse einfügen, aber hoffentlich nur die Audio-Klasse ist notwendig) :java.io.IOException: mark/reset nicht unterstützt
java.io.IOException: mark/reset not supported
at java.util.zip.InflaterInputStream.reset(Unknown Source)
at java.io.FilterInputStream.reset(Unknown Source)
at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source)
at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
at com.neet.Audio.JukeBox.load(JukeBox.java:26)
at com.neet.GameState.IntroState.<init>(IntroState.java:28)
at com.neet.GameState.GameStateManager.loadState(GameStateManager.java:48)
at com.neet.GameState.GameStateManager.setState(GameStateManager.java:72)
at com.neet.GameState.GameStateManager.<init>(GameStateManager.java:31)
at com.neet.Main.GamePanel.init(GamePanel.java:70)
at com.neet.Main.GamePanel.run(GamePanel.java:75)
at java.lang.Thread.run(Unknown Source)
Und hier die Audio-Klasse ist: `
package com.neet.Audio;
import java.util.HashMap;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
public class JukeBox {
private static HashMap<String, Clip> clips;
private static int gap;
private static boolean mute = false;
public static void init() {
clips = new HashMap<String, Clip>();
gap = 0;
}
public static void load(String s, String n) {
if(clips.get(n) != null) return;
Clip clip;
try {
AudioInputStream ais =
AudioSystem.getAudioInputStream(
JukeBox.class.getResourceAsStream(s)
);
AudioFormat baseFormat = ais.getFormat();
AudioFormat decodeFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false
);
AudioInputStream dais = AudioSystem.getAudioInputStream(decodeFormat, ais);
clip = AudioSystem.getClip();
clip.open(dais);
clips.put(n, clip);
}
catch(Exception e) {
e.printStackTrace();
}
}
public static void play(String s) {
play(s, gap);
}
public static void play(String s, int i) {
if(mute) return;
Clip c = clips.get(s);
if(c == null) return;
if(c.isRunning()) c.stop();
c.setFramePosition(i);
while(!c.isRunning()) c.start();
}
public static void stop(String s) {
if(clips.get(s) == null) return;
if(clips.get(s).isRunning()) clips.get(s).stop();
}
public static void resume(String s) {
if(mute) return;
if(clips.get(s).isRunning()) return;
clips.get(s).start();
}
public static void loop(String s) {
loop(s, gap, gap, clips.get(s).getFrameLength() - 1);
}
public static void loop(String s, int frame) {
loop(s, frame, gap, clips.get(s).getFrameLength() - 1);
}
public static void loop(String s, int start, int end) {
loop(s, gap, start, end);
}
public static void loop(String s, int frame, int start, int end) {
stop(s);
if(mute) return;
clips.get(s).setLoopPoints(start, end);
clips.get(s).setFramePosition(frame);
clips.get(s).loop(Clip.LOOP_CONTINUOUSLY);
}
public static void setPosition(String s, int frame) {
clips.get(s).setFramePosition(frame);
}
public static int getFrames(String s) { return clips.get(s).getFrameLength(); }
public static int getPosition(String s) { return clips.get(s).getFramePosition(); }
public static void close(String s) {
stop(s);
clips.get(s).close();
}
}`
Ich habe keine direkte Kenntnis davon, wie das Audio-Subsystem funktioniert, aber von der Stack-Trace würde es scheinen, dass 'AudioSystem.getAudioInputStream (...)' etwas will, das mark/reset unterstützt, aber die konkrete Klasse von 'getResourceAsStream 'unterstützt es nicht. Führen Sie das aus einer JAR-Datei aus, in der sich der Sound auch in der JAR-Datei befindet? Das ist möglicherweise nicht erlaubt, da ein jar (zip) -Mitglied wahrscheinlich nur vorwärts gelesen wird und höchst unwahrscheinlich ist, Suchvorgänge zu unterstützen. –
Die Sounds befinden sich im Ressourcenpaket als .wav- und .mp3-Dateien. Beeinflusst das das? – user1766089
Der Schlüssel ist, ob das Ganze (Code und Sounds) in eine JAR-Datei gepackt wird und Sie es mit 'java -jar filename.jar' ausführen. Wenn das stimmt, müssen Sie möglicherweise die Audiodateien in temporäre Dateien auf der Festplatte kopieren. –