2010-05-31 18 views
0

好吧,即時嘗試做的是讓我的景觀背後的夜晚循環。有一個太陽和一個月亮,他們在相反的一側旋轉一圈。 (即當太陽升起時,太陽升起,反之亦然),當太陽升起時,它應該從夜間動畫片剪輯到黎明動畫片剪輯,然後當太陽升起一點點時,淡入到當天moviclip,這工作得很好,但由於某種原因,當它到達日落時,它不會工作:/和從日落到夜晚的時候一樣:/任何和所有的healp都非常感激,我花了5幾小時試圖弄清楚這一點,不能!請幫忙!閃存as3,淡入/淡出分層問題

stage.addEventListener(Event.ENTER_FRAME, daynightcycle) 

//setChildIndex(night, getChildIndex(day)); 

setChildIndex(sunset, 0); 
setChildIndex(day, 1); 
setChildIndex(dawn, 2); 
setChildIndex(night, 3); 

function daynightcycle(e:Event):void { 

if(sun.currentLabel == "dawn") { 
    setChildIndex(sunset, 0); 
    setChildIndex(day, 1); 
    setChildIndex(dawn, 2); 
    setChildIndex(night, 3); 
    stage.addEventListener(Event.ENTER_FRAME, nightTdawn); 

}else if(sun.currentLabel == "sunset") { 
    setChildIndex(dawn, 0); 
    setChildIndex(night, 1); 
    setChildIndex(sunset, 2); 
    setChildIndex(day, 3); 
    stage.addEventListener(Event.ENTER_FRAME, dayTsunset); 

}else if(sun.currentLabel == "night") { 
    setChildIndex(day, 0); 
    setChildIndex(dawn, 1); 
    setChildIndex(night, 2); 
    setChildIndex(sunset, 3); 
    stage.addEventListener(Event.ENTER_FRAME, sunsetTnight); 

}else if(sun.currentLabel == "day") { 
    setChildIndex(night, 0); 
    setChildIndex(sunset, 1); 
    setChildIndex(day, 2); 
    setChildIndex(dawn, 3); 
    stage.addEventListener(Event.ENTER_FRAME, dawnTday); 

}else if(sun.currentLabel == "switch") { 
    stage.addEventListener(Event.ENTER_FRAME, switchLayers); 
} 



} 

function nightTdawn(e:Event):void { 


if(night.alpha != 0) { 

    night.alpha -= 0.01; 
}else { 
    stage.removeEventListener(Event.ENTER_FRAME, nightTdawn); 
    night.alpha = 100; 
    //setChildIndex(night, getChildIndex(sunset)); 
} 


} 


function dayTsunset(e:Event):void { 


if(day.alpha != 0) { 
    day.alpha -= 0.01; 
}else { 
    stage.removeEventListener(Event.ENTER_FRAME, dayTsunset); 
    day.alpha = 100; 
    //setChildIndex(day, getChildIndex(dawn)); 
} 

//day.visible = false; 
//sunset.visible = true; 

} 
function sunsetTnight(e:Event):void { 


if(sunset.alpha != 0) { 
    sunset.alpha -= 0.01; 
}else{ 
    stage.removeEventListener(Event.ENTER_FRAME, sunsetTnight); 
    sunset.alpha = 100; 
    //setChildIndex(sunset, (getChildIndex(day))); 
} 

//sunset.visible = false; 
//night.visible = true; 

} 
function dawnTday(e:Event):void { 

sunset.visible = true; 
day.visible = true; 

if(dawn.alpha != 0) { 
    dawn.alpha -= 0.01; 
}else{ 
    stage.removeEventListener(Event.ENTER_FRAME, dawnTday); 
    dawn.alpha = 100; 
    //setChildIndex(dawn, (getChildIndex(night))); 
} 
} 

function switchLayers(e:Event):void { 
setChildIndex(dawn, 0); 
setChildIndex(night, 1); 
setChildIndex(sunset, 2); 
setChildIndex(day, 3); 

night.alpha = 100; 
sunset.alpha = 100; 
day.alpha = 100; 
dawn.alpha = 100; 
stage.removeEventListener(Event.ENTER_FRAME, switchLayers); 

} 

回答

1

問題可能從以下事實daynightcycle()被調用每一幀莖,它進而被每次增加一個新的enterFrame事件偵聽器。

另外,在每一幀調用daynightcycle()時,當你改變太陽狀態時你真的只需要調用它就相當昂貴。

我已經用更簡潔的風格重寫了它,所以它應該很清楚發生了什麼。

如果你不熟悉的switch/case語法,然後看這樣的解釋:As3 Switch Statement

var incomingLayer:DisplayObject 

//initialize the order of the layers 
setChildIndex(sunset, 0); 
setChildIndex(day, 1); 
setChildIndex(dawn, 2); 
setChildIndex(night, 3); 


//call this function anytime you change the label of the sun 
function onSunLabelChanged():void 
{ 
    switch (sun.currentLabel) 
    { 
     case "dawn": 
      switchToLayer(dawn); 
      break; 
     case "sunset": 
      switchToLayer(sunset); 
      break; 
     case "night": 
      switchToLayer(night); 
      break; 
     case "day": 
      switchToLayer(day); 
      break; 
    } 
} 


function switchToLayer(targ:DisplayObject):void 
{ 
    incomingLayer = targ; //save a reference to the incoming layer 
    incomingLayer.alpha = 0; //make it transparent 
    setChildIndex(incomingLayer, 3); //put it on top 
    stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); //set a listener to fade it in 
} 


function onEnterFrame(e:Event):void 
{ 
    incomingLayer.alpha += 0.01; //increment the alpha of the incoming layer 
    if (incomingLayer.alpha >= 1) //if the layer is fully opaque 
    { 
     stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame); //remove the listener 
    } 
} 
+0

WOW! thanx標誌!我對開關語句並不熟悉,但是有一個問題,當太陽標籤改變以使整體工作時,我如何調用「onSunLabelChanged()」函數? :/ – 2010-06-07 02:15:05

+0

這取決於,你是否通過代碼更新太陽?或者它是一個只是循環的MovieClip? – 2010-06-07 06:44:48

+0

它的一個影片剪輯,做循環,我應該改變? – 2010-06-07 14:18:21