0

我在调试音频滑块时遇到了困难。我很确定我的问题在于我的一种方法changeVolumeRedFireball只是以非常快的速度不断重复。在我的游戏中,我每隔一段时间就会听到一个小故障的声音,所以这似乎是相关的。我在方法内部追踪了“输出”,并很快发现它正在以很高的速度重复。

问题是,我不知道这是从哪里来的!另一个注意事项。这只会在我按住滑块时开始重复,因此激活changeVolumeRedFireballfromdragSliderRedFireball

我确实有来自其他类的其他方法引用此类中的方法。他们只能访问playSoundRedFireballstopSoundRedFireball虽然,所以我不明白为什么会有任何影响。此外,这个类是由我的文档类在游戏启动时实例化的。如果需要,我想我会从文档类中放入相关代码,但我只是认为它根本不会影响这个问题。

package {

        import flash.display.Sprite;
        import flash.display.Graphics;
        import flash.events.MouseEvent;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.media.Sound;
        import flash.media.SoundChannel;
        import flash.media.SoundTransform;
        import flash.geom.Rectangle;

        public class VolumeRedFireball extends Sprite {

                public var redFireballSnd:Sound = new Sound();
                public var redFireballChannel:SoundChannel = new SoundChannel();
                //URLRequest=new URLRequest("solitude.wav");
                //Make sure you pass URLRequest an audio file on your computer.
                public var reqRedFireball:EnemyAppearSound = new EnemyAppearSound();
                public var boundaryRedFireball:Rectangle;
                public var spriteRedFireball:Sprite;
                public var sliderRedFireball:Sprite;
                public var xPosRedFireball:Number;
                public var yPosRedFireball:Number;
                public static var volRedFireball:Number = 1;

                public function VolumeRedFireball() {
                        this.addEventListener(Event.ADDED_TO_STAGE, onStageRedFireball,false,0,true);
                        volRedFireball=1;
                        redFireballChannel.soundTransform=new SoundTransform(volRedFireball)
                }

                public function onStageRedFireball(e:Event):void
                {
                    //We remove it immediately so that it doesn't get called multiple times
                    //As the instance is added to the display list tree
                    this.removeEventListener(Event.ADDED_TO_STAGE, onStageRedFireball);

                    xPosRedFireball = 320;
                    yPosRedFireball = 170;

                    initRedFireball();
                }


                public function initRedFireball():void {
                        spriteRedFireball = new Sprite();
                        redFireballChannel.stop();
                        spriteRedFireball.graphics.beginFill(0x999999);
                        spriteRedFireball.graphics.drawRect(xPosRedFireball,yPosRedFireball,100,5);
                        spriteRedFireball.graphics.endFill();
                        addChild(spriteRedFireball);
                        spriteRedFireball.x-=spriteRedFireball.width/2;
                        sliderRedFireball = new Sprite();
                        sliderRedFireball.graphics.beginFill(0xFF0000);
                        sliderRedFireball.graphics.drawCircle(xPosRedFireball+50,yPosRedFireball, 15);
                        sliderRedFireball.graphics.endFill();
                        addChild(sliderRedFireball);
                        sliderRedFireball.addEventListener(MouseEvent.MOUSE_DOWN, dragsliderRedFireball);
                        stage.addEventListener(MouseEvent.MOUSE_UP, stopsliderRedFireball);
                        boundaryRedFireball=new Rectangle(-100,0,100,0);
                }


                public function dragsliderRedFireball(event:MouseEvent):void {
                        sliderRedFireball.startDrag(false,boundaryRedFireball);
                        sliderRedFireball.removeEventListener(MouseEvent.CLICK, dragsliderRedFireball);
                        sliderRedFireball.addEventListener(Event.ENTER_FRAME, changeVolumeRedFireball);
                }


                public function stopsliderRedFireball(event:MouseEvent):void {
                        sliderRedFireball.stopDrag();
                        sliderRedFireball.removeEventListener(MouseEvent.MOUSE_UP, stopsliderRedFireball);
                }



                public function changeVolumeRedFireball(event:Event):void {
                        volRedFireball=1+Math.round(sliderRedFireball.x)/100;
                        redFireballChannel.soundTransform=new SoundTransform(volRedFireball);
                        trace("output");   
                }


                public function playSoundRedFireball():void
                {
                    redFireballChannel = reqRedFireball.play();
                }

                public function stopSoundRedFireball():void
                {
                    redFireballChannel.stop();
                }

        }

}
4

1 回答 1

2

在每一帧中更改 aSoundTransform并不好,因为您实际上是在破坏音频通道。如果您使用MouseEvent.MOUSE_MOVE触发音量更改会更好,就像移动鼠标并拖动音量滑块一样,SWF 用户显然希望音量更改。但是如果用户开始拖动滑块但没有移动它,为什么要改变音量呢?

public function dragsliderRedFireball(event:MouseEvent):void {
                    sliderRedFireball.startDrag(false,boundaryRedFireball);
                    sliderRedFireball.removeEventListener(MouseEvent.MOUSE_DOWN, dragsliderRedFireball);
                    sliderRedFireball.addEventListener(MouseEvent.MOUSE_MOVE, changeVolumeRedFireball);
                    sliderRedFireball.removeEventListener(MouseEvent.MOUSE_UP, stopsliderRedFireball);
            }


            public function stopsliderRedFireball(event:MouseEvent):void {
                    sliderRedFireball.stopDrag();
                    sliderRedFireball.removeEventListener(MouseEvent.MOUSE_UP, stopsliderRedFireball);
                    sliderRedFireball.removeEventListener(MouseEvent.MOUSE_MOVE, changeVolumeRedFireball);
                    sliderRedFireball.addEventListener(MouseEvent.MOUSE_DOWN, dragsliderRedFireball);
            }

另外,你把你的听众搞砸了。首先,停止拖动火球后,您并没有移除 enterframe 侦听器。其次,在火球释放后,您不会添加启动拖动侦听器。第三,出于一个非常奇怪的原因,在您的中,initRedFireball您正在将其添加stopsliderRedFireballstage的侦听器,但您正试图将其从sliderRedFireball. 请准确注意您的听众去哪里,他们听什么,您将他们从哪里移除以及从哪些对象中移除。滥用 enterframe 侦听器会很快建立起来,并破坏你所有的乐趣。

于 2013-07-26T14:52:49.517 回答