1

我已经制作了这个工作正常的代码 - 我的问题是最后我希望让它重新开始。

当我开始制作这个时,我的意图是,.swf 电影在结束时会循环播放——但这并没有发生。然后我想我会尝试在代码本身中创建一种“重新启动”功能,以重置计时器和字符串..我已经用谷歌搜索并自己尝试了几件事 - 但根本没有运气..

首先,我尝试重置变量 i。然后我试图删除计时器事件监听器。但没有成功。

让这段代码重新开始的最好方法是什么?

import flash.utils.Timer;
import flash.events.TimerEvent;
import com.greensock.*;
import com.greensock.easing.*;

var str_one:String = 'På fredag udkommer metroXpress, som du kender den, for sidste gang... ';
var i:uint = 0;
var timer_one:Timer = new Timer(50);
timer_one.start();
timer_one.addEventListener(TimerEvent.TIMER, goTime);

var str_two:String = 'På fredag udkommer metroXpress, som du kender den, for sidste gang... Fra 2. april bliver du mødt af en helt ny avis, med det bedste fra den gamle, tilsat en masse nyt.';
var timer_two:Timer = new Timer(50);
timer_two.addEventListener(TimerEvent.TIMER, goTime_two);

var str_three:String = 'På fredag udkommer metroXpress, som du kender den, for sidste gang... Fra 2. april bliver du mødt af en helt ny avis, med det bedste fra den gamle, tilsat en masse nyt.Sådan vil vi skabe en endnu bedre avis til dig, der er på farten. Glæd dig – det gør vi!';
var timer_three:Timer = new Timer(50);
timer_three.addEventListener(TimerEvent.TIMER, goTime_three);

function goTime(e:TimerEvent) {
    tekstbox1_txt.appendText(str_one.charAt(i));
    i++;
    if (i>=str_one.length) {
        timer_one.stop();
        TweenLite.to(hand, 1, {y:175, onComplete:ripwhite});
        }
    }

function ripwhite():void {
    TweenLite.to(hand, 1, {y:405});
    TweenLite.to(white_mask, 1, {y:320, onComplete:fadetekst1ud});
}

function fadetekst1ud():void {
    TweenLite.to(tekstbox1_txt, 1, {alpha:0, onComplete:tekstnr2});
    }

function tekstnr2():void {
timer_two.start();
}

function goTime_two(e:TimerEvent) {
    tekstbox2_txt.appendText(str_two.charAt(i));
    i++;
    if (i>=str_two.length) {
        timer_two.stop();
        TweenLite.to(tekstbox2_txt, 1, {alpha:1, onComplete:forsinkelse});
        }
    }

function forsinkelse():void {
    TweenLite.to(tekstbox2_txt, 1, {alpha:0, onComplete:tekstnr3});
    }

function tekstnr3():void {
timer_three.start();
}

function goTime_three(e:TimerEvent) {
    tekstbox3_txt.appendText(str_three.charAt(i));
    i++;
    if (i>=str_three.length) {
        timer_three.stop();
        TweenLite.to(tekstbox3_txt, 1, {alpha:1, onComplete:sidstefunktion});
        }
    }

function sidstefunktion():void {
    TweenLite.to(tekstbox3_txt, 1, {alpha:0});
    TweenLite.to(rippedpic, 1, {alpha:0});
    }

编辑:

设置重置功能然后使其循环回我的初始功能时,如下所示:

function nulstil():void {
    i = 0;
    TweenLite.killTweensOf(hand);
    TweenLite.killTweensOf(tekstbox1_txt);
    TweenLite.killTweensOf(tekstbox2_txt);
    TweenLite.killTweensOf(tekstbox3_txt);
    timer_one.addEventListener(TimerEvent.TIMER, goTime);
    timer_two.addEventListener(TimerEvent.TIMER, goTime_two);
    timer_two.addEventListener(TimerEvent.TIMER, goTime_three);
    TweenLite.to(white_mask, 0.1, {onComplete:goTimeAgain});
    }

我在输出中得到以下信息:

ArgumentError:错误 #1063:Untitled_fla::MainTimeline/goTimeAgain() 上的参数计数不匹配。预期 1,得到 0。在 Function/ http://adobe.com/AS3/2006/builtin::apply() at com.greensock.core::TweenCore/complete() at com.greensock::TweenLite/renderTime( ) 在 com.greensock.core::SimpleTimeline/renderTime() 在 com.greensock::TweenLite$/updateAll()

4

1 回答 1

2

我在评论中建议您使用 TimelineMax。这是我认为应该工作的完整代码。仔细注意我在哪里使用offset论点append和在哪里不使用。您需要填写resetEverything函数以将所有视觉元素设置为其正确的起始位置、alpha 等。

基本上这是如何工作的:Timers我们不使用addCallbackTimelineMax 的功能。回调在时间轴中的“长度”为 0,因此您必须在附加回调时手动推进播放头,以及在每批回调之后添加第一个补间时(这就是我们使用 offset 参数的地方)。不过,补间确实有一个长度,因此后续调用append将自动将补间与时间轴的末尾对齐,就像在该点建立的那样。

在我们指定的 TimelineMax 的构造函数中repeat : -1,这将导致时间线永远循环。最后,我们resetEverything在一开始就添加了回调,这样每次时间线重新启动时,我们都可以确保所有元素都处于正确的开始位置。其余的都是完全自动的,由时间线处理。

import com.greensock.*;

var str_one:String = 'På fredag udkommer metroXpress, som du kender den, for sidste gang... ';
var str_two:String = 'Fra 2. april bliver du mødt af en helt ny avis, med det bedste fra den gamle, tilsat en masse nyt.';
var str_three:String = 'Sådan vil vi skabe en endnu bedre avis til dig, der er på farten. Glæd dig – det gør vi!';

//-------- HELPER FUNCTIONS ---------//

// Set everything to start positions
function resetEverything():void {
    // Set alphas, positions, etc. 
    hand.x = <start x>;
    hand.y = <start y>;
    //
}

// Quick reusable callback
function addText(textBox:TextField, text:String):void { textBox.appendText(text); }

//-------- BUILD THE TIMELINE ---------//
var timeline:TimelineMax = new TimelineMax({repeat : -1}); //repeat = -1 --> loop forever
timeline.pause();
timeline.addCallback(resetEverything, 0);

var lng:uint = str_one.length;
var playHead:Number = 0.05;
for(var i:uint = 0; i < lng; i++) {
    timeline.addCallback(addText, playHead, [tekstbox1_txt, str_one.charAt(i)]);
    playHead += 0.05;
}
timeline.append(new TweenLite(hand, 1, {y:175}), lng * 0.05);  // !!Note the offset argument here!!
timeline.append(new TweenLite(hand, 1, {y:405}));
timeline.append(new TweenLite(white_mask, 1, {y:320}));
timeline.append(new TweenLite(tekstbox1_txt, 1, {alpha:0}));

playHead += 4;
lng = str_two.length;
for(i = 0; i < lng; i++) {
    timeline.addCallback(addText, playHead, [tekstbox2_txt, str_two.charAt(i)]);
    playHead += 0.05;
}
timeline.append(new TweenLite(tekstbox2_txt, 1, {alpha:1}), lng * 0.05); // !!Note the offset argument here!!
timeline.append(new TweenLite(tekstbox2_txt, 1, {alpha:0}));

playHead += 2;
lng = str_three.length;
for(i = 0; i < lng; i++) {
    timeline.addCallback(addText, playHead, [tekstbox3_txt, str_three.charAt(i)]);
    playHead += 0.05;
}
timeline.append(new TweenLite(tekstbox3_txt, 1, {alpha:1}), lng * 0.05); // !!Note the offset argument here!!
timeline.append(new TweenLite(tekstbox3_txt, 1, {alpha:0});
timeline.append(new TweenLite(rippedpic, 1, {alpha:0});

timeline.play();
于 2013-03-18T14:10:43.280 回答