好吧,我想做的是让我的风景背后一天一夜。有一个太阳和一个月亮,它们在相对的两侧旋转成一个圆圈。 (即当月亮下降时太阳升起,反之亦然)当太阳升起时,它应该从夜间电影片段褪色到黎明电影片段,然后当太阳升起一点点时,淡入日间运动,这很有效,但是,出于某种原因,当它到达日落时,它就不会起作用了:/从日落到夜晚也一样:/任何和所有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);
}
答案 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
}
}