flash as3, проблема с наложением слоев - PullRequest
0 голосов
/ 01 июня 2010

Хорошо, я пытаюсь сделать цикл изо дня в ночь позади моего пейзажа. Есть солнце и луна, они вращаются по кругу с разных сторон. (т. е. солнце встает, когда луна опускается, и наоборот), когда солнце взлетает, оно должно исчезнуть из ночного видеоклипа в рассветный видеоклип, затем, когда солнце встает немного больше, исчезнуть в дневной видеоклип это работает довольно хорошо, но по какой-то причине, когда он добирается до заката, он просто не будет работать: / и то же самое будет, когда он переходит от заката к ночи: / любая и вся помощь очень ценится, я потратил 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 Ответ

1 голос
/ 06 июня 2010

Проблема, скорее всего, связана с тем, что daynightcycle () вызывается для каждого кадра, и каждый раз он добавляет новый приемник EnterFrame.

Кроме того, довольно дорого вызывать функцию daynightcycle () для каждого отдельного кадра, когда вам действительно нужно вызывать его только при изменении состояния солнца.

Я переписал его для вас в более чистом стиле, так что должно быть достаточно ясно, что происходит.

Если вы не знакомы с синтаксисом Switch / Case, посмотрите это объяснение: Заявление о переключении As3

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
    }
}
...