如何使用MovieClip变量在脚本之间共享变量?

时间:2017-11-20 15:25:15

标签: actionscript-3 flash

我正在尝试为我的Uni项目编写一个交互式时间轴(请记住我是一个新的编码器),然后我们会查看基本的actionscript内容。我被教导使用movieclip变量在脚本之间进行通信并声明this.parent。 我有3个脚本,一个控制用于在时间轴中向前移动的按钮,一个是主要的,另一个控制显示时间线的文本框。我在main中放置了一个数字变量,初始化为0(timeCount)。在按钮脚本中,我使用refToMain(我的movieclip变量)将其链接到main。在按钮脚本中,如果用户单击该按钮,则使用refToMain(refToMain.timeCount)从main获取数字变量。我的目标是让文本框脚本跟踪数字,每个数字都有不同的时间轴。但是,当我在按钮脚本中跟踪timeCount时,数字似乎很好并相应地提高,但它不会更改任何其他脚本中的数字。如何使用基本的as3代码修复此问题? 在Main:

var timeCount:Number = 0;

按钮:

            public function mDown (mDown:MouseEvent){
            refToMain.timeCount += 1;
            if(refToMain.timeCount >= 10){
            refToMain.timeCount = 10;
            }
            trace(refToMain.timeCount);

在时间表中:

            if(refToMain.timeCount == 0){
                timelineText.text = "welcome"
            }
            if(refToMain.timeCount == 1){
                timelineText.text = "hello"
            }

2 个答案:

答案 0 :(得分:1)

您是否希望时间轴中的代码连续运行而不是仅运行一次?每次时间轴到达该帧时,帧脚本只会运行一次。如果你只有一个框架,那么时间轴根本不会前进。如果是这种情况,一个简单的解决方法是使用F5将另一个帧添加到时间轴,然后您的时间轴将永久地在两个帧之间交替,以便第1帧上的脚本将每隔一帧执行一次。

更好的选择是调用每次单击按钮时直接更新时间轴文本的脚本。因此,您可以将代码从时间轴脚本移动到按钮脚本,如下所示:

public function mDown (mDown:MouseEvent) {
    refToMain.timeCount += 1;
    if(refToMain.timeCount >= 10) {
        refToMain.timeCount = 10;
    }
    trace(refToMain.timeCount);
    if(refToMain.timeCount == 0) {
        MovieClip(root).timelineText.text = "welcome";
    }
    if(refToMain.timeCount == 1) {
        MovieClip(root).timelineText.text = "hello";
    }
}

答案 1 :(得分:0)

有多种方法和方法可以在您的应用程序中访问对象和变量。

1)遍历。 (可能)较旧且最直接的是完全理解和控制display list tree。如果您了解当前脚本的位置以及目标脚本的位置,您只需使用 root 遍历此树直到顶部,以升级并< strong> getChildByName 或 [] 或点符号以降低级别。

优点:很简单。 Contras :这种方法的弱点在于其缺乏灵活性。一旦更改了显示列表树的结构,就可能会破坏访问权限。此外,这种方式您可能无法访问不在显示列表中的内容。此外,有些情况下点符号不起作用,并且有些情况 getChildByName 不起作用。毕竟, 简单。

2)冒泡事件。这些是冒泡从显示列表的深度到根的事件。冒泡的鼠标事件:您可以从最深的对象捕获它,这些对象有一些鼠标事件,然后它的所有直到阶段。你可以阅读它们here。因此,您可以从您想要的任何深度发送气泡,然后在事件目标的任何父级拦截它们:

// *** TextEvent.as class file *** //
package
{
    import flash.events.Event;

    public class TextEvent extends Event
    {
        static public const TEXT_EVENT:String = "text_event";

        public var text:String;

        // Although it is not a very good practice to leave the basic Event
        // parameters out of it, but it will do for this example.
        public function TextEvent(value:String)
        {
            // Set type = "text_event" and bubbles = true.
            super(TEXT_EVENT, true);
            text = value;
        }
    }
} 

// *** Button script *** //
import TextEvent;
// Dispatch the event.
dispatchEvent(new TextEvent("welcome"));

// *** Main timeline *** //
import TextEvent;
// Subscribe to catch events.
addEventListener(TextEvent.TEXT_EVENT, onText);

function onText(e:TextEvent):void
{
    // Extract the passed text value.
    timelineText.text = e.text;
}

优点:它在应用程序架构术语中表现良好。 Contras :您无法在不是事件源父级的位置捕获冒泡事件。

3)静态班级成员。或单身模式,它基本相同。您可以设计一个在整个应用程序中共享特定值和引用的类:

// *** SharedData.as class file *** //
package
{
    import flash.display.MovieClip;

    public class SharedData
    {
        static public var MainTimeline:MovieClip;
    }
}

// *** Main timeline *** //
import SharedData;
// Make root accessible from anywhere.
SharedData.MainTimeline = this;

// *** Button script *** //
import SharedData;
// You can access main timeline via shared reference.
SharedData.MainTimeline.timelineText.text = "welcome";

优点:您不再受显示列表结构的限制,您也可以通过这种方式共享非可视实例。 Contras :小心时间轴,他们倾向于在播放头移动时销毁和创建时间轴实例,因此当时间轴保持不再有新实例时,最终不会引用对已删除对象的引用共享。