UltimateShooter/assets/Scripts/SoundsManager.ts

76 lines
2.6 KiB
TypeScript

// Learn TypeScript:
// - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/typescript.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/reference/attributes.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - [Chinese] https://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html
// - [English] http://www.cocos2d-x.org/docs/creator/manual/en/scripting/life-cycle-callbacks.html
const {ccclass, property} = cc._decorator;
@ccclass
export default class SoundManager extends cc.Component {
private static _instance: SoundManager = null;
private sounds: { [key: string]: cc.AudioClip } = {};
private musicId: number = -1;
public static get instance(): SoundManager {
if (!this._instance) {
const node = new cc.Node("SoundManager");
cc.game.addPersistRootNode(node); // stays across scenes
this._instance = node.addComponent(SoundManager);
}
return this._instance;
}
// ✅ Preload all your sounds at startup
preloadSounds() {
cc.loader.loadResDir("sounds", cc.AudioClip, (err, clips, urls) => {
if (err) {
cc.error("Error loading sounds:", err);
return;
}
for (let i = 0; i < clips.length; i++) {
const key = urls[i].split("/").pop(); // file name without path
this.sounds[key] = clips[i];
}
cc.audioEngine.setMusicVolume(0.1);
});
}
// ✅ Play short effects (clicks, shots, explosions)
playEffect(name: string, loop: boolean = false) {
const clip = this.sounds[name];
if (clip) {
cc.audioEngine.setEffectsVolume(0.2);
cc.audioEngine.playEffect(clip, loop);
} else {
cc.warn(`Sound '${name}' not found. Make sure it's preloaded.`);
}
}
// ✅ Play/Stop background music
playMusic(name: string, loop: boolean = true) {
const clip = this.sounds[name];
if (clip) {
if (this.musicId !== -1) {
cc.audioEngine.stop(this.musicId);
}
this.musicId = cc.audioEngine.playMusic(clip, loop);
} else {
cc.warn(`Music '${name}' not found. Make sure it's preloaded.`);
}
}
stopMusic() {
cc.audioEngine.stopMusic();
this.musicId = -1;
}
}