изменение переменных в запущенном SWF-файле из загрузчика SWFLoader

У меня есть гибкое приложение, скомпилированное с помощью flex 4.1.

Я хочу, чтобы это гибкое приложение загружало SWF-файл, содержащий переменную оценку, и я хочу иметь возможность изменять эту переменную.

Я написал две версии swf, одну скомпилированную с кодом as2, а другую с кодом as3.

это мое гибкое приложение:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

<fx:Script>
<![CDATA[

        import mx.events.FlexEvent;
        import mx.managers.SystemManager;

private var loadedSM:SystemManager;

private function initNestedAppProps():void
{
loadedSM = SystemManager(ufkLoader.content);
loadedSM.addEventListener(FlexEvent.APPLICATION_COMPLETE,updateNestedLabels);
}

private function updateNestedLabels(e:Event):void {
loadedSM.application["score"]=500;
}

]]>
</fx:Script>
<mx:SWFLoader  loadForCompatibility="true" width="500" height="500" creationComplete="initNestedAppProps()" id="ufkLoader" source="http://127.0.0.1/path/to/swf.swf" />
</s:Application>

Когда я запускаю приложение Flex в своем браузере на 127.0.0.1 (тот же домен), я получаю следующую ошибку:

An ActionScript error has occurred:
TypeError: Error #1034: Type Coercion failed: cannot convert Main__Preloader__@f36e6191 to mx.managers.SystemManager.
at Main/initNestedAppProps()
at Main/__ufkLoader_creationComplete()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()
at mx.core::UIComponent/set initialized()
at mx.managers::LayoutManager/doPhasedInstantiation()
at mx.managers::LayoutManager/doPhasedInstantiationCallback()

Я получаю такое сообщение об ошибке при попытке запустить код as3 или as2.

Я проверил в Google, и некоторые люди написали, что для флеш-приложения нет необходимости использовать системный менеджер и просто преобразовать SWFLoader.content в качестве объекта и попытаться вызвать функции оттуда.

поэтому используя следующий код:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

<fx:Script>
<![CDATA[
private function updateNestedLabels(e:Event):void {
trace("HERE");
ufkLoader.content['score']=500;
}
]]>
</fx:Script>
<mx:SWFLoader  loadForCompatibility="true" width="500" height="500" complete="updateNestedLabels(event)" id="ufkLoader" source="http://127.0.0.1/~ufk/work-projects/xpofb/flash/toolkit-test/scores/as3/score.swf" />
  </s:Application>

Я получаю следующую ошибку при запуске версии as3:

An ActionScript error has occurred:
ReferenceError: Error #1056: Cannot create property score on Main__Preloader__.
at Main/updateNestedLabels()
at Main/__ufkLoader_complete()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()
at mx.controls::SWFLoader/http://www.adobe.com/2006/flex  /mx/internal::contentLoaderInfo_completeEventHandler()

и следующая ошибка при запуске версии as3:

An ActionScript error has occurred:
ReferenceError: Error #1056: Cannot create property score on flash.display.AVM1Movie.
at Main/updateNestedLabels()
at Main/__ufkLoader_complete()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()
at mx.controls::SWFLoader/http://www.adobe.com/2006/flex/mx/internal::contentLoaderInfo_completeEventHandler()

мой файл as2 swf содержит текстовый элемент с именем score_text и следующий код в первом и единственном кадре:

var score:Number = 0;

function setScore() {
  score++;
  score_text.text=score.toString();
}

function addToScore(num:Number) { 
  score+=num;
  setScore();
}
setInterval(setScore,1000);

мой файл as3 flash содержит основной класс с именем Main и тот же текстовый элемент с именем score_text.

Основной класс:

package  {

import flash.display.MovieClip;
import flash.utils.setInterval;

public class Main extends MovieClip {
public var score:Number = 0;

public function setScore() {
score++;
score_text.text=score.toString();
}

public function addToScore(num:Number) {  
score+=num; 
setScore();
}

    public function Main() {
    setInterval(setScore,1000);     
    }
}

}

Любые идеи?


person ufk    schedule 23.06.2011    source источник
comment
Я думал, вы сказали, что код as3 имеет функцию setScore(). Почему ты делаешь content['score']=500. (В as3 setScore не интерпретируется как установщик. Вы хотите использовать set score(value:Number):void в коде as3 или ufkLoader.content.setScore(500); в приложении Flex.   -  person Jacob Eggers    schedule 23.06.2011
comment
упс, я изменил вопрос. Я хочу иметь возможность изменять переменные, чтобы не выполнять функции. Я также добавлю свои источники вспышки.   -  person ufk    schedule 23.06.2011
comment
Вы пробовали источник в моем ответе?   -  person Jacob Eggers    schedule 25.06.2011
comment
да, я отправлю комментарий по этому поводу.   -  person ufk    schedule 26.06.2011


Ответы (1)


Я думаю, что это то, что вы хотите:

package  {

import flash.display.MovieClip;
import flash.utils.setInterval;

public class Main extends MovieClip {
    private var _score:Number = 0;

    public function set score(value):void {
       _score = value;
       score_text.text=score.toString();
    }

    public function addToScore(num:Number):void {  
        score+=num; 
    }


    public function Main() {

    }
}

} 
person Jacob Eggers    schedule 23.06.2011
comment
я не совсем понимаю, что вы предоставили. Чем отличается ваш класс таким образом, чтобы я мог получить доступ к его переменным? - person ufk; 26.06.2011
comment
Он имеет публичные функции и публичный получатель. Кроме того, в вашем коде была какая-то странность. (addToScore(5) фактически добавит 6 к очкам ...) - person Jacob Eggers; 26.06.2011