2013-03-29 4 views
0

Я пишу образовательное программное обеспечение, которое использует единственное swf-приложение, которое загружает SWF-файлы внешнего «темы» (содержащие элементы библиотеки, относящиеся к теме) , Каждый из этих внешних SWF-файлов темы также использует пользовательские классы, которые разрешают вычисления, специфичные для этой темы (например, тригонометрический класс для файла темы trigonometry.swf).ActionScript 3.0, ссылающийся на пользовательский класс основного swf из пользовательского класса загруженного swf

Я хочу, чтобы класс тригонометрии тригонометрии.swf мог ссылаться на собственный метод класса, который существует в основном «приложении» swf. Если это помогает узнать контекст, я хочу, чтобы пользователь, работающий над тригонометрией, мог ввести триггерную функцию, считающую себя правильной (sin, cos или tan) и «проверить», чтобы убедиться, что они правы. Метод «указать_right_wrong» существует в пользовательском классе «грейдер» основного swf-приложения (так что любые изменения, которые я делаю для этого класса, будут обновляться по всем темам). Итак ... как я могу ссылаться на собственный метод класса основного swf FROM из собственного настраиваемого класса внешнего SWF-файла?

У меня есть результат, когда я импортирую пользовательский класс «грейдер» в каждую «тему» ​​swf и ссылаюсь на него напрямую, но я не хочу повторно публиковать каждую тему swf, если я вношу изменения к классу «грейдер». Таким образом, я пытаюсь, чтобы каждая тема могла ссылаться на пользовательский класс «грейдер», когда он существует в основном «приложении» swf.

Ошибка, возникающая при попытке использовать варианты родительского или parent.parent: property grader_class not found on flash.display.Stage (для родителя) и Cannot access a property or method of a null object reference. (при использовании parent.parent).

Благодарим за помощь, которую вы можете предоставить.

+0

Вы должны быть в состоянии получить доступ к родительскому классу через в ApplicationDomain в [getDefinition()] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript /3/flash/system/ApplicationDomain.html#getDefinition()). Что-то вроде: 'yourMasterSWFReference.loaderInfo.applicationDomain.getDefinition (" the.qualified.ClassYouNeed ")'. Другой вариант, возможно, более чистый - ваш загруженный swf отправляет событие или сигнал с данными, необходимыми для проверки/проверки, и мастер swf прослушивает это, а в обработчике обрабатывает запрос и отправляет результат. –

ответ

1

Вы не можете скомпилировать код, который вызывает методы, не найденные в компилируемом коде. Однако вы можете выполнять вызовы во время выполнения, оценивая метод. Например:

stage["myfunction"](args); 

Тем не менее, в то время как вы могли бы создать какую-то Pathing логики ссылаться на свои методы, так как 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; 

Ребенок.швейцарских франков

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

Красивый трюк. Никогда раньше такого не делал, поэтому сегодня я узнал что-то новое. Отсюда мой голос на ваш ответ. –

0

Не знаю, если тихо, потому что это такой вопрос был дан ответ много раз на переполнение стека. В любом случае здесь мое взятие на этом ..

Я хочу, чтобы пользователь, работающий на тригонометрии, чтобы иметь возможность ввести в Триг функции ВЕРИТ быть правильным (грех, потому, или загар) и «проверить» на убедитесь, что они правы.

Я предполагаю, что, поскольку они должны ввести ответ, у вас есть текстовое поле ввода? Также, когда они ответили, они нажимают кнопку, чтобы «отправить» свой ответ? Предполагая, что я на правильном пути, мы можем сделать это таким образом ...

примечание: answer_txt (строка) = ответ дается во внешнем классе пользователем, input_txt = TextField для пользовательского ввода

в главном классе есть что-то вроде

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 
} 
+0

Doh .. Я немного бодрствую сейчас, и я вижу, что Джордж Форенца и Атриос в основном говорили то же самое (челюсть падает на это предложение «Check_Answer as event»). Мой ответ показывает пример кода, что они означают. Также Atriace может быть на что-то. Слушайте мудро и благодарите за лучшую помощь. мир –

Смежные вопросы