【问题标题】:Flash restart functions after completion完成后Flash重启功能
【发布时间】:2013-03-06 16:30:13
【问题描述】:

我制作的这段代码运行良好 - 我的问题是最后我希望让它重新开始。

当我开始制作这个时,我的意图是,.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。 在函数/http://adobe.com/AS3/2006/builtin::apply() 在 com.greensock.core::TweenCore/complete() 在 com.greensock::TweenLite/renderTime() 在 com.greensock.core::SimpleTimeline/renderTime() 在 com.greensock::TweenLite$/updateAll()

【问题讨论】:

  • 创建一个将在整个序列结束时调用的函数,它将重置所有变量和掩码大小 - 以及您在代码中所做的任何更改。
  • @Lukasz'Severiaan'Grela 我想知道如何重置补间,以及如何删除正在进行的补间(如果有的话),如果由TweenLite.to() 调用。没有这个,这项任务可能是不可能的。
  • 但是如何重置变量?
  • @Vesper 杀死 Tweens 使用:TweenLite.killTweensOf(YourFuncOrObject);像 TweenLite.killTweensOf(hand);
  • 嗨 steffen -- 由于您已经在使用 GreenSock,这似乎是 TimelineLite/TimelineMax 的理想应用程序。它将允许您倒带并重新启动整个 Tweens 层次结构,而无需重新创建它们。

标签: actionscript-3 flash timer reset


【解决方案1】:

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

基本上这是如何工作的:我们不使用Timers,而是使用TimelineMax 的addCallback 功能。回调在时间轴中的“长度”为 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();

【讨论】:

  • 函数 addText(textBox:TextField, text:String):void { textBox.appendText(text); } 使用分号给出错误,第 22 行也是如此 :-) 第 28 行返回此错误无效的 XML 名称 - 加上 4 个其他错误都连接到 XML 标记..
  • 嗯,是的,您必须将“”和“”替换为您需要的实际值!
  • 我收到此错误:错误 1067 将类型编号的值隐式强制转换为与第 34、45 和 54 行相关的不相关类型数组 - 例如;时间线.addCallback(addText, [tekstbox2_txt, str_two.charAt(i)], playHead);
  • @steffenhenriksen 糟糕,我把这两个论点倒过来了。应该是addCallback(addText, playHead, [txt*, str*.charAt(i)]);。我已经相应地更新了我的代码。请参阅API documentation
  • 它现在可以工作了——只是有点陈词滥调,文本相互重叠。文本两个在文本一个淡出之前淡入——是我需要更改的一些偏移量还是它线的排列?
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-16
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多