Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 从SWFLoader修改正在运行的swf中的变量_Apache Flex_Swfloader - Fatal编程技术网

Apache flex 从SWFLoader修改正在运行的swf中的变量

Apache flex 从SWFLoader修改正在运行的swf中的变量,apache-flex,swfloader,Apache Flex,Swfloader,我有一个用Flex4.1编译的flex应用程序 我希望flex应用程序加载一个包含变量score的swf,并且我希望能够修改这个变量 我编写了两个版本的swf,一个用as2代码编译,另一个用as3编译 这是我的flex应用程序: <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://

我有一个用Flex4.1编译的flex应用程序

我希望flex应用程序加载一个包含变量score的swf,并且我希望能够修改这个变量

我编写了两个版本的swf,一个用as2代码编译,另一个用as3编译

这是我的flex应用程序:

<?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>
我在尝试运行as3或as2代码时收到这种错误消息

我在google上查看过,一些人写道,对于flash应用程序,不需要使用系统管理器,只需将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()
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);     
    }
}

}

有什么想法吗?

我想这正是你想要的:

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() {

    }
}

} 

我记得你说过as3代码有一个函数setScore。你为什么要做内容['score']=500。在as3中,setScore不被解释为setter。您希望在as3代码或ufkLoader.content.setScore500中使用set scorevalue:Number:void;在flex app.oops中,我修改了这个问题。我希望能够修改变量而不是执行函数。我还将添加我的flash源。你在我的回答中尝试了源吗?是的,我将对此发表评论。我不太明白你提供了什么。你们的类在允许我访问它的变量方面有什么不同?它有公共函数和公共getter。另外,您的代码中有一些奇怪之处。addToScore5实际上会使分数增加6。。。
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() {

    }
}

}