You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
5.3 KiB
158 lines
5.3 KiB
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<Integer, Image> 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;
|
|
}
|
|
} |