我正在尝试为我的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"
}
答案 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 :小心时间轴,他们倾向于在播放头移动时销毁和创建时间轴实例,因此当时间轴保持不再有新实例时,最终不会引用对已删除对象的引用共享。