ActionScript 3.0 如何调用 SoundManager 到所有 类

ActionScript 3.0 How to call SoundManager to all classes

我有 3 个 类。 SoundManager.as、MainMenu.as 和 OnGame.as。

如何在 MainMenu.as 和 OnGame.as 上正确调用 SoundManager?

我试过: MainMenu.as:

var sound:SoundManager = new SoundManager();

OnGame.as:

var sound:SoundManager = new SoundManager();

但是当我关闭 OnGame.as 上的背景音乐时,MainMenu 上的背景音乐没有关闭。

抱歉我的英语和解释不好。请帮助我。

//已编辑

当我从 onGame.as 中的 SoundManager 调用函数 'MUTE' 并返回主菜单时,MainManu.as 中的背景音乐没有静音。请帮帮我。

SoundManager.as

public static var mVolume:SoundTransform = new SoundTransform();
public static var mChannel:SoundChannel = new SoundChannel();
public static var mPosition:Number;
public static var music:Sound = new Sound();

public static var Music:Boolean = true;

public function LOADMUSIC():void {
  if(Music){
    UNMUTE();
  }else {
    MUTE();
  }
    music.addEventListener(Event.COMPLETE, LOADMUSIC);
    mChannel = music.play();
    mChannel.addEventListener(Event.SOUND_COMPLETE, ONCOMPLETE);
}
public function ONCOMPLETE(e:Event):void {
  if(DataBase.music){
     UNMUTE();
  }else{
     MUTE();
  } 
  e.currentTarget.removeEventListener(Event.SOUND_COMPLETE, ONCOMPLETE);
 LOADMUSIC();
}       
public function REMOVE_MUSIC():void{
  try{
    mChannel.stop();
    music = null;
  }catch(e:Error) {}
}
public function MUTE():void {
  mVolume.volume = 0;
  mChannel.soundTransform = mVolume;
}
public function UNMUTE():void {
  mVolume.volume = 1;
  mChannel.soundTransform = mVolume;
}

MainMenu.as

var sound:SoundManager;
btn_music.addEventListener(TouchEvent:TOUCH_END, MUSIC);

public MainMenu(sound:SoundManager){

  this.sound = sound;

  sound.REMOVE_MUSIC();
  SoundManager.music = new BackgroundMusic01();
  sound.LOADMUSIC();
}
private function MUSIC(e:TouchEvent):void {
  if(SoundManager.Music){
    SoundManager.music = false;
    sound.MUTE();
  }else {
    SoundManager.Music = true;
    sound.UNMUTE();
  }
}

OnGame.as

var sound:SoundManager;
btn_music.addEventListener(TouchEvent:TOUCH_END, MUSIC);

public OnGame(sound:SoundManager){

  this.sound = sound;

  sound.REMOVE_MUSIC();
  SoundManager.music = new BackgroundMusic02();
  sound.LOADMUSIC();
}
private function MUSIC(e:TouchEvent):void {
  if(SoundManager.Music){
    SoundManager.music = false;
    sound.MUTE();
  }else {
    SoundManager.Music = true;
    sound.UNMUTE();
  }
}

换背景音乐没问题。当我使用 MainMenu btn_music 将 MainMenu 中的 bgmusic 静音时,它可以工作,它在 OnGame 中也可以工作。但如果是从 OnGame 到 MainMenu 或 MainMenu 到 Ongame,则 bgmusic 不会静音。我看不出有什么问题。请帮我。抱歉我的英语不好。

有几种方法可以做到这一点,其中之一是使用 Singleton class。 跟随一个例子:

package
{
    public class CustomSoundManager
    {
        private static var _instance:CustomSoundManager;

        public function CustomSoundManager()
        {
            if (_instance)
            {
                throw new Error('CustomSoundManager... use getInstance()');
            }
            _instance = this;
        }

        public static function getInstance():CustomSoundManager
        {
            if (!_instance)
            {
                 new CustomSoundManager();
            }

            return _instance;
        }

        public function soundOn():void
        {
            // your logic to turn the sound on
        }

        public function soundOff():void
        {
            // your logic to turn the sound off
        }
    }
}

因此,无论在哪里(例如 MainMenu.as、OnGame.as),您都可以使用这些方法:

CustomSoundManager.getInstance().soundOn();
CustomSoundManager.getInstance().soundOff();

单例或其他一些静态(全局)访问是一种简单的方法。但只是添加一个替代解决方案,according to some a "better way" is to use dependency injection。针对您的情况的一个简单示例可能如下所示:

首先,在 MainMenuOnGame class 中添加 SoundManager 实例的构造函数参数(有效地声明依赖项):

public class MainMenu {
    private var sound:SoundManager;
    public function MainMenu(sound:SoundManager){
        this.sound = sound;
    }
}

public class OnGame {
    private var sound:SoundManager;
    public function OnGame(sound:SoundManager){
        this.sound = sound;
    }
}

然后在更高级别 class,您可以创建一个 SoundManager 并将其传递给需要它的 classes:

public class Main {
    private var sound:SoundManager;
    public function Main(){
        sound = new SoundManager();
    }
    private function showMenu():void {
        var menu:MainMenu = new MainMenu(sound);
        addChild(menu);
    }
    private function showGame():void {
        var game:OnGame = new OnGame(sound);
        addChild(game);
    }
}

最终结果是您有一个 SoundManager 实例在各种 class 之间重复使用。

因为我看不出我的代码有什么问题。由于我的游戏中只有 1 个频道,因此我使用 SoundMixer 对音乐背景进行静音和取消静音。

import flash.media.SoundMixer;
...

...
public function MUTE():void {
  mVolume.volume = 0;
  SoundMixer.soundTransform = mVolume;
}
public function UNMUTE():void {
  mVolume.volume = 1;
  SoundMixer.soundTransform = mVolume;
}

谢谢。