flash as3,淡入/淡出分层问题

时间:2010-05-31 22:18:19

标签: actionscript-3 flash fade

好吧,我想做的是让我的风景背后一天一夜。有一个太阳和一个月亮,它们在相对的两侧旋转成一个圆圈。 (即当月亮下降时太阳升起,反之亦然)当太阳升起时,它应该从夜间电影片段褪色到黎明电影片段,然后当太阳升起一点点时,淡入日间运动,这很有效,但是,出于某种原因,当它到达日落时,它就不会起作用了:/从日落到夜晚也一样:/任何和所有healp都非常感激,我花了5小时试图解决这个问题,不能!请帮忙!

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 个答案:

答案 0 :(得分: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
    }
}