diff --git a/scr/tetris/ResourceManager.java b/scr/tetris/ResourceManager.java new file mode 100644 index 0000000..b07b416 --- /dev/null +++ b/scr/tetris/ResourceManager.java @@ -0,0 +1,158 @@ +package tetris; + +import javax.sound.sampled.*; +import javax.swing.*; +import java.awt.*; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +public class ResourceManager { + private static ResourceManager instance; + private final Map blockImages = new HashMap<>(); + private Clip backgroundMusic; + private Image prepareBackground; + private Clip prepareMusic; + private Image gameBackground; // 新增游戏背景图 + private Clip clearSound; // 新增消除音效 + + private ResourceManager() { + loadResources(); + } + + public static ResourceManager getInstance() { + if (instance == null) instance = new ResourceManager(); + return instance; + } + + private void loadResources() { + loadBlockImages(); + loadPrepareResources(); + loadGameResources(); + loadBackgroundMusic(); + loadClearSound(); // 新增加载消除音效 + } + + // 新增消除音效加载方法 + private void loadClearSound() { + try (InputStream is = getClass().getResourceAsStream("/sounds/clear.wav")) { + if (is != null) { + System.out.println("成功加载消除音效"); // 调试输出 + AudioInputStream audioIn = AudioSystem.getAudioInputStream(is); + clearSound = AudioSystem.getClip(); + clearSound.open(audioIn); + } else { + System.err.println("消除音效文件未找到"); // 错误提示 + } + } catch (Exception e) { + showError("消除音效加载失败: " + e.getMessage()); + } + } + + // 新增消除音效播放方法 + public void playClearSound() { + if (clearSound != null) { + clearSound.stop(); + clearSound.setFramePosition(0); + clearSound.start(); + } + } + + private void loadGameResources() { + try { + ImageIcon gameBg = new ImageIcon(getClass().getResource("/images/game_bg.jpg")); // 假设游戏背景图路径为 /images/game_bg.jpg + gameBackground = gameBg.getImage(); + } catch (Exception e) { + showError("游戏背景资源加载失败: " + e.getMessage()); + } + } + + private void loadPrepareResources() { + try { + ImageIcon prepareBg = new ImageIcon(getClass().getResource("/images/prepare_bg.jpg")); + prepareBackground = prepareBg.getImage(); + + InputStream is = getClass().getResourceAsStream("/sounds/prepare.wav"); + AudioInputStream audioIn = AudioSystem.getAudioInputStream(is); + prepareMusic = AudioSystem.getClip(); + prepareMusic.open(audioIn); + } catch (Exception e) { + showError("准备资源加载失败: " + e.getMessage()); + } + } + + private void loadBlockImages() { + try { + for (int i = 0; i < 7; i++) { + String path = "/images/blocks/block_" + i + ".png"; + ImageIcon icon = new ImageIcon(getClass().getResource(path)); + if (icon.getImageLoadStatus() != MediaTracker.COMPLETE) { + showError("图片加载失败: " + path); + continue; + } + blockImages.put(i, icon.getImage()); + } + } catch (Exception e) { + showError("图片加载异常: " + e.getMessage()); + } + } + + private void loadBackgroundMusic() { + try (InputStream is = getClass().getResourceAsStream("/sounds/background.wav")) { + if (is == null) { + showError("音乐文件未找到"); + return; + } + AudioInputStream audioIn = AudioSystem.getAudioInputStream(is); + backgroundMusic = AudioSystem.getClip(); + backgroundMusic.open(audioIn); + backgroundMusic.loop(Clip.LOOP_CONTINUOUSLY); + } catch (Exception e) { + showError("音乐播放失败: " + e.getMessage()); + } + } + + public Image getBlockImage(int type) { + return blockImages.getOrDefault(type % 7, blockImages.get(0)); + } + + public void playBackgroundMusic() { + if (backgroundMusic != null) { + stopMusic(); // 确保停止所有正在播放的音乐 + backgroundMusic.setFramePosition(0); + backgroundMusic.start(); + } + } + + public void stopMusic() { + // 同时停止背景音乐和准备音乐 + if (backgroundMusic != null && backgroundMusic.isRunning()) { + backgroundMusic.stop(); + } + stopPrepareMusic(); // 新增:同时停止准备音乐 + } + + private void showError(String msg) { + JOptionPane.showMessageDialog(null, msg, "资源错误", JOptionPane.ERROR_MESSAGE); + } + + public Image getPrepareBackground() { + return prepareBackground; + } + + public void playPrepareMusic() { + if (prepareMusic != null) { + prepareMusic.loop(Clip.LOOP_CONTINUOUSLY); + } + } + + public void stopPrepareMusic() { + if (prepareMusic != null && prepareMusic.isRunning()) { + prepareMusic.stop(); + } + } + + public Image getGameBackground() { + return gameBackground; + } +} \ No newline at end of file