actionscript 3.0从加载的swf的自定义类引用主swf的自定义类

时间:2013-03-29 09:27:04

标签: actionscript-3

我正在编写使用单个“应用程序”swf的教育软件,该软件加载外部“主题”swf文件(包含特定于该主题的库项目)。每个外部“主题”swf文件还使用自定义类来解决特定于主题的计算(例如,trigonometry.swf主题文件的三角函数类)。

我希望trigonometry.swf的trigonometry类能够引用主“application”swf中存在的自定义类方法。如果它有助于了解上下文,我希望使用三角函数的用户能够输入相信正确的sin函数(sin,cos或tan)并“检查”以查看它们是否正确。 “indication_right_wrong”方法存在于主“application”swf的“grader”自定义类中(因此我对此类所做的任何更改都将在所有主题中更新)。那么......如何从外部加载的swf文件自己的自定义类中引用主swf的自定义类方法?

当我将“grader”自定义类导入每个“topic”swf并直接引用它时,我的结果是有效的,但如果我对其进行更改,我不希望重新发布每个主题swf “平地机”自定义课程。因此,我试图让每个主题能够引用“grader”自定义类,当它存在于主“应用程序”swf中时。

我尝试使用parent或parent.parent的变体时得到的错误是property grader_class not found on flash.display.Stage(对于父级)和Cannot access a property or method of a null object reference.(当使用parent.parent时)。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:1)

您无法编译调用正在编译的代码中找不到的方法的代码。但是,您可以通过评估方法来进行运行时调用。例如:

stage["myfunction"](args);

然而,虽然您可以创建某种路径逻辑来引用您的方法,如George Profenza所示,如果您只是将函数侦听器传递给已分派,您的成功将更高(并且更容易使用)事件或方法调用。

例如,假设您有一个自定义CHECK_ANSWER事件,当用户输入答案时会触发该事件。您的gradeAnswer()函数(存在于“application.swf”中)需要在加载子“trigonometry.swf”后注册该事件。随后,数据将通过。

然而,这可能并不理想,因为它可能导致子SWF由于父对象注册而无法正确地从内存中卸载(必须首先删除所有注册)。

就个人而言,我建议创建一个静态类,作为应用程序的目录。每个swf加载此类,并根据需要列出其相关方法。例如:

package com.atriace {
    public class Directory {
        public static var methods:Object = {

        }
    }
}

当application.swf加载时,它会使用您的评分函数填充方法对象。后续子swfs也会加载此静态类,并期望找到预先填充的成绩方法。

<强> Application.swf

import com.atriace.Directory;
Directory.methods["grade"] = gradeAnswer;

<强> Child.swf

import com.atriace.Directory;
Directory.methods["grade"](answers);

答案 1 :(得分:0)

不知道安静是否因为Stack Overflow之前已经多次回答过这种问题。无论如何,这是我对它的看法..

  

我希望处理三角函数的用户能够输入trig   功能相信是正确的(罪,cos或棕褐色)和“检查”   看他们是否正确。

我假设因为他们必须输入你有输入文本框的答案吗?当他们回答时,按一个按钮“提交”他们的答案?假设我在正确的路线上,我们可以这样做......

  

注意:answer_txt(string)=用户在外部类中给出的答案,input_txt =用户输入的文本字段

在主类中有类似

的东西
import flash.display.Stage;
import flash.display.MovieClip;
import flash.events.*;

import ExternalClass; //your class file attached to relevant topic swf

public class Main extends MovieClip 
{
    private var _extClass = new ExternalClass(); //create reference to external Class

    public function Main() 
   {
    //Ref 1 means do that function when trigger event received from external class 
    stage.addChild(_extClass); //gives access to "stage" for ExternalClass.as
    _extClass.addEventListener("Check_Answer", indicate_right_wrong); //see Ref 1
   }

 private function indicate_right_wrong (e:Event)
{
 //your answer checking code. 
 //Access answer_txt variable from external class like example below
 //_extClass.answer_txt.text = " ";
}

现在在外部类(Trigonometry.as ??)中,你可以设置这样的东西。确保answer_txt存在(public var answer_txt:String;)..

public function  Question_1 () : void
{
 //your code for question + set submit button
 submit_BTN.addEventListener(MouseEvent.CLICK, send_Answer);
}

function send_Answer(e:MouseEvent):void 
{
 answer_txt = input_txt.text; //set input text as final answer
 trace("final answer is..." + answer_txt); //just to test it's there  

 dispatchEvent (new Event ("Check_Answer")); //Main class is waiting for this event (ref 1)
 trace ("event dispatched.." + dispatchEvent); //to confirm it was despatched
}