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

Actionscript 3 flash as3,淡入/淡出分层问题,actionscript-3,flash,fade,Actionscript 3,Flash,Fade,好的,我想做的是在我的风景后面做一个昼夜循环。有一个太阳和一个月亮,它们在相对的一边绕着一个圈旋转。(即当月亮落下时太阳升起,反之亦然)当太阳升起时,它应该从夜间电影剪辑到黎明电影剪辑,然后当太阳升起一点时,逐渐消失到白天电影剪辑,这很有效,但是,由于某种原因,当它到达日落时,这是行不通的:/从日落到夜晚也一样:/非常感谢所有的希普,我花了5个小时试图弄明白这一点,但做不到!请帮忙 stage.addEventListener(Event.ENTER_FRAME, daynightcycle)

好的,我想做的是在我的风景后面做一个昼夜循环。有一个太阳和一个月亮,它们在相对的一边绕着一个圈旋转。(即当月亮落下时太阳升起,反之亦然)当太阳升起时,它应该从夜间电影剪辑到黎明电影剪辑,然后当太阳升起一点时,逐渐消失到白天电影剪辑,这很有效,但是,由于某种原因,当它到达日落时,这是行不通的:/从日落到夜晚也一样:/非常感谢所有的希普,我花了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);

}

问题可能源于这样一个事实:daynightcycle()在每一帧上都被调用,而它每次都会添加一个新的EnterFrame侦听器

此外,在每一帧上调用daynightcycle()是相当昂贵的,而您实际上只需要在更改太阳状态时调用它

我已经用一种更干净的方式为你重写了它,所以应该很清楚到底发生了什么

如果您不熟悉Switch/Case语法,请观看以下说明:


哇!马克!我不熟悉switch语句,但有一个问题,当太阳的标签发生变化时,如何调用“onUnlabelChanged()”函数以使整个过程正常工作/那要看情况了,你是在用代码更新太阳吗?或者它是一个循环的MovieClip?它是一个循环的MovieClip,我应该改变它吗?不,那很好,你应该能够只做一个“动作”层,在标签改变的每个点上放置一个关键帧,在每个关键帧的动作中放置:onUnlabelChanged();唯一的潜在问题是onUnlabelChanged()可能不在sun MovieClip的可变范围内,但如果不查看整个应用程序,我无法帮助您解决这一问题。请在此阅读:
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
    }
}