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。针对您的情况的一个简单示例可能如下所示:
首先,在 MainMenu
和 OnGame
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;
}
谢谢。
我有 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。针对您的情况的一个简单示例可能如下所示:
首先,在 MainMenu
和 OnGame
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;
}
谢谢。