2013-07-26 51 views
0

我很難調試我的音頻滑塊。我很確定我的問題在於我的方法之一changeVolumeRedFireball只是以非常快的速度不斷重複。我在遊戲中每隔一段時間就會聽到一聲毛骨悚然的聲音,所以它似乎是相互關聯的。我在方法內部追蹤「輸出」,並很快發現它以高速重複。Actionscript 3.0方法不斷重複,不知道爲什麼

問題是,我無法弄清楚這是從哪裏來的!另一個說明。這隻會開始重複,一旦我按住我的滑塊,因此激活changeVolumeRedFireball from dragSliderRedFireball

我確實有其他類引用此類中的方法的其他方法。但他們只能訪問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(); 
       } 

     } 

} 
+0

sliderRedFireball.addEventListener(Event.ENTER_FRAME,changeVolumeRedFireball); <==dernièreligne de dragsliderRedFireball。 laméthodechangeVolumeRedFireball estappelléeàchaque frame(soit plusieurs dizaines de fois par seconde)。 – Aralicia

+0

讓我們看看谷歌翻譯是否幫助我在這裏.... – spaderdabomb

+0

好吧,所以加入changeVolumeRedFireball ---> sliderRedFireball.removeEventListener(Event.ENTER_FRAME,changeVolumeRedFireball)應該修復它嗎? – spaderdabomb

回答

2

改變每一幀期間SoundTransform是不好的,因爲你基本上是破壞音頻通道。如果使用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中,您正在將stopsliderRedFireball添加爲階段,原因很奇怪,但您試圖將其從sliderRedFireball中刪除。請特別注意聽衆的去向,他們聽什麼,以及將他們從哪些對象中移除。錯誤使用框架監聽器可以很快建立起來,並且會讓您大玩。

+0

謝謝=),不幸的是這導致我的音樂和聲音完全消失。試圖弄清楚爲什麼=( – spaderdabomb

+0

'changeVolumeRedFireball()'中的軌跡座標,也許你是用錯誤的來計算音量百分比,這完全取決於使用正確的數據 – Vesper

+0

只是一個大寫錯誤,發現它!哈哈對不起。但現在滑塊可以工作並改變音量,但聲音仍然以最大音量播放-.- – spaderdabomb

相關問題