2014-04-24 39 views
0

我有行星繞中心點運行,如果按下'g'鍵一次,當行星經過飛機時,hittestobject會觸發每個行星的單獨聲音。當按下'e'鍵時,它會爲每個行星播放不同的聲音。此時聲音互相播放(在頂部)。我怎麼能這樣做,當按下g或e鍵時,它會檢查是否有其中一種聲音正在播放並將其關閉? 我感謝任何幫助。當按下某個鍵時停止某個功能

import flash.media.SoundChannel; 
import flash.events.Event; 

var sunmc:sun = new sun(); 
var mcp1:mc1 = new mc1(); 
var mcp2:mc2 = new mc2(); 
var mcp3:mc3 = new mc3(); 
var mcp4:mc4 = new mc4(); 
var mcp5:mc5 = new mc5(); 
var mcp6:mc6 = new mc6(); 
var mcp7:mc7 = new mc7(); 
var mcp8:mc8 = new mc8(); 

//------------soundsGrav 
var mercGrav:Sound = new gravMerc(); 
var gravMercChannel:SoundChannel; 
var mercSoundIsPlaying:Boolean = true; 

var venusGrav:Sound = new gravVenus(); 
var gravVenusChannel:SoundChannel; 
var venusSoundIsPlaying:Boolean = true; 

var earthGrav:Sound = new gravEarth(); 
var gravEarthChannel:SoundChannel; 
var earthSoundIsPlaying:Boolean = true; 

var marsGrav:Sound = new gravMars(); 
var gravMarsChannel:SoundChannel; 
var marsSoundIsPlaying:Boolean = true; 

var jupGrav:Sound = new gravJup(); 
var gravJupChannel:SoundChannel; 
var jupSoundIsPlaying:Boolean = true; 

var satGrav:Sound = new gravSat(); 
var gravSatChannel:SoundChannel; 
var satSoundIsPlaying:Boolean = true; 

var uraGrav:Sound = new gravUra(); 
var gravUraChannel:SoundChannel; 
var uraSoundIsPlaying:Boolean = true; 

var neptGrav:Sound = new gravNept(); 
var gravNeptChannel:SoundChannel; 
var neptSoundIsPlaying:Boolean = true; 

var hitTest:Boolean = false; 
//------------ 

//------------soundsOrbital Eccentricity 
var mercOrbEcc:Sound = new orbEccMerc(); 
var orbEccMercChannel:SoundChannel; 
var mercEccSoundIsPlaying:Boolean = true; 

var venusOrbEcc:Sound = new orbEccVenus(); 
var orbEccVenusChannel:SoundChannel; 
var venusEccSoundIsPlaying:Boolean = true; 

var earthOrbEcc:Sound = new orbEccEarth(); 
var orbEccEarthChannel:SoundChannel; 
var earthEccSoundIsPlaying:Boolean = true; 

var marsOrbEcc:Sound = new orbEccMars(); 
var orbEccMarsChannel:SoundChannel; 
var marsEccSoundIsPlaying:Boolean = true; 

var jupOrbEcc:Sound = new orbEccJup(); 
var orbEccJupChannel:SoundChannel; 
var jupEccSoundIsPlaying:Boolean = true; 

var satOrbEcc:Sound = new orbEccSat(); 
var orbEccSatChannel:SoundChannel; 
var satEccSoundIsPlaying:Boolean = true; 

var uraOrbEcc:Sound = new orbEccUra(); 
var orbEccUraChannel:SoundChannel; 
var uraEccSoundIsPlaying:Boolean = true; 

var neptOrbEcc:Sound = new orbEccNept(); 
var orbEccNeptChannel:SoundChannel; 
var neptEccSoundIsPlaying:Boolean = true; 

var hitTestOrb:Boolean = false; 
//------------ 


this.addChild(sunmc); 
sunmc.x = 400; 
sunmc.y = 400; 

this.addChild(mcp1); 
this.addChild(mcp2); 
this.addChild(mcp3); 
this.addChild(mcp4); 
this.addChild(mcp5); 
this.addChild(mcp6); 
this.addChild(mcp7); 
this.addChild(mcp8); 

var allSpeed:Number=1.1; 

var p1Speed:Number=.0479; // 88.0 /5 = 17.6 
var p1Radius:Number=70;  // 57.9 
var p1Orbit:Number=0; 

var p2Speed:Number=.035; // 224.7 /5 = 44.94 
var p2Radius:Number=100; //10.8.2 
var p2Orbit:Number=0; 

var p3Speed:Number=.0298; // 365.2 /5 = 73.04 
var p3Radius:Number=130; //14.9.6 
var p3Orbit:Number=0; 

var p4Speed:Number=.0241;  //687.0 /5 = 137.4 
var p4Radius:Number=160; //22.7.9 
var p4Orbit:Number=0; 

var p5Speed:Number=.0131; // 4331.0 /5 = 866.2 
var p5Radius:Number=190; //77.8.6 
var p5Orbit:Number=0; 

var p6Speed:Number=.0097; //10747.0 /5 = 2149.4 
var p6Radius:Number=230; //143.3.5 
var p6Orbit:Number=0; 

var p7Speed:Number=.0068; //30589.0 /5 = 6117.8 
var p7Radius:Number=270; //287.2.5 
var p7Orbit:Number=0; 

var p8Speed:Number=.0054; //59800.0 /5 = 11960.0 
var p8Radius:Number=360; //449.5.1 
var p8Orbit:Number=0; 
//----------- 


//-----------changing speed of orbit 
stage.addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown); 
function myKeyDown (e:KeyboardEvent):void{ 

if (e.keyCode == Keyboard.LEFT){ 
p1Speed /= allSpeed; 
p2Speed /= allSpeed; 
p3Speed /= allSpeed; 
p4Speed /= allSpeed; 
p5Speed /= allSpeed; 
p6Speed /= allSpeed; 
p7Speed /= allSpeed; 
p8Speed /= allSpeed; 
} 

if (e.keyCode == Keyboard.RIGHT){ 
p1Speed *= allSpeed; 
p2Speed *= allSpeed; 
p3Speed *= allSpeed; 
p4Speed *= allSpeed; 
p5Speed *= allSpeed; 
p6Speed *= allSpeed; 
p7Speed *= allSpeed; 
p8Speed *= allSpeed; 
} 
} 
//---------- 

this.addEventListener(Event.ENTER_FRAME, planetOrbits); 
function planetOrbits(myEvent:Event):void { 

    p1Orbit+=p1Speed;//*allSpeed; 
    mcp1.x=Math.cos(p1Orbit)*p1Radius+sunmc.x; 
    mcp1.y=Math.sin(p1Orbit)*p1Radius+sunmc.y; 

    p2Orbit+=p2Speed; 
    mcp2.x=Math.cos(p2Orbit)*p2Radius+sunmc.x; 
    mcp2.y=Math.sin(p2Orbit)*p2Radius+sunmc.y; 

    p3Orbit+=p3Speed; 
    mcp3.x=Math.cos(p3Orbit)*p3Radius+sunmc.x; 
    mcp3.y=Math.sin(p3Orbit)*p3Radius+sunmc.y; 

    p4Orbit+=p4Speed; 
    mcp4.x=Math.cos(p4Orbit)*p4Radius+sunmc.x; 
    mcp4.y=Math.sin(p4Orbit)*p4Radius+sunmc.y; 

    p5Orbit+=p5Speed; 
    mcp5.x=Math.cos(p5Orbit)*p5Radius+sunmc.x; 
    mcp5.y=Math.sin(p5Orbit)*p5Radius+sunmc.y; 

    p6Orbit+=p6Speed; 
    mcp6.x=Math.cos(p6Orbit)*p6Radius+sunmc.x; 
    mcp6.y=Math.sin(p6Orbit)*p6Radius+sunmc.y; 

    p7Orbit+=p7Speed; 
    mcp7.x=Math.cos(p7Orbit)*p7Radius+sunmc.x; 
    mcp7.y=Math.sin(p7Orbit)*p7Radius+sunmc.y; 

    p8Orbit+=p8Speed; 
    mcp8.x=Math.cos(p8Orbit)*p8Radius+sunmc.x; 
    mcp8.y=Math.sin(p8Orbit)*p8Radius+sunmc.y; 
} 


function setup() { 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, displayKey); 
} 
setup(); 

function displayKey(keyEvent:KeyboardEvent) { 

    if (keyEvent.keyCode == 71) { 

     addEventListener(Event.ENTER_FRAME, hitTestmerc); 

     function hitTestmerc(evt:Event){ 

      if(mcp1.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravMercChannel = mercGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp2.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravVenusChannel = venusGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp3.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravEarthChannel = earthGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp4.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravMarsChannel = marsGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp5.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravJupChannel = jupGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp6.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravSatChannel = satGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp7.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravUraChannel = uraGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 

     if(mcp8.hitTestObject(mchit)){ 

       if(!hitTest){ 
       gravNeptChannel = neptGrav.play(); 
       hitTest = true; 
       } 
       else{ 
       hitTest = false; 
       } 
      } 
     } 

    } 


    else if (keyEvent.keyCode == 69) { 

     addEventListener(Event.ENTER_FRAME, hitTestmercEcc); 

     function hitTestmercEcc(evt:Event){ 

      if(mcp1.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccMercChannel = mercOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp2.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccVenusChannel = venusOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp3.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccEarthChannel = earthOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp4.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccMarsChannel = marsOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp5.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccJupChannel = jupOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp6.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccSatChannel = satOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp7.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccUraChannel = uraOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     if(mcp8.hitTestObject(mchit)){ 

       if(!hitTestOrb){ 
       orbEccNeptChannel = neptOrbEcc.play(); 
       hitTestOrb = true; 
       } 
       else{ 
       hitTestOrb = false; 
       } 
      } 

     } 

    } 
} 
+1

嘗試解決您的問題。沒有人想要通過所有這些代碼。具體詢問! – DaGardner

+0

如果你想檢測一個聲音是否正在播放並停止它:http://stackoverflow.com/a/194653/472647 – CodeMouse92

回答

0

在按鍵檢測時,您不會刪除任何一個enterframe listener。看,你在那裏addEventListener(Event.ENTER_FRAME, hitTestmercEcc);,但沒有對應的removeEventListener(Event.ENTER_FRAME, hitTestmercEcc);被稱爲。因此,兩個功能同時工作,產生兩組聲音。在你的情況下,你最好有一個你想播放什麼樣的聲音的標誌,並從一個事件監聽器調用相應的函數。就像這樣:

var ecc:Boolean=false; // if calling Ecc function 
function onEnterFrame(e:Event):void { 
    if (ecc) hitTestmercEcc(e); 
    else hitTestmerc(e); 
} 

現在,只要你按下這些鍵,你只需要改變的ecc值是這樣的:

function displayKey(keyEvent:KeyboardEvent) { 
    if (keyEvent.keyCode == 71) { 
     ecc = false; 
    } else if (keyEvent.keyCode == 69) { 
     ecc = true; 
    } 
} 

仍然需要你則hitTest功能,但要確保他們位於任何其他功能體內。你有他們目前在function displayKey()大括號 - 這種做法是不好的。主要是因爲你沒有從別的地方訪問嵌套函數,它可能會讓你面對醜陋的問題。

相關問題