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