2

我希望我能在我的动作脚本问题上得到一些帮助。

(inb4:'你到底想完成什么(除了在未经用户许可的情况下打开任意文件)?'链接

我正在尝试协助学生练习 - 所以我想我会想出一个随机画廊的例子。这样做的想法是学生将能够生成一个 SWF 文件,并且在同一目录中,他们将拥有一个包含图像的文件夹。然后 SWF 电影将读取目录的内容;选择一个随机图像,并显示它。

我希望这可以在本地完成(在学生发展的同时)——而且,如果他们选择这样做,他们应该能够在线上传整个目录——并且希望该示例能够以任何方式工作。事实证明这并不容易 - 所以这些是我的问题

  • 他们说,为了获得本地目录列表,我应该使用 AIR - 这是什么意思?如果它使用 AIR ,是否有一些可执行文件 -除了flashplayerdebugger- 我应该调用以重现 SWF?
    • 是否可以在不使用此 AIR 的情况下获取本地目录列表(类似于下面的 Flex 代码?)
  • 看来我可以加载本地文本文件;但我无法加载本地位图文件。是否也可以加载位图文件?
  • 如果碰巧您无法访问 Internet,因此您无法访问,您如何授予文件/文件夹的本地访问权限settings_manager04.html- 但您希望将 Flash 应用程序与本地文件和网络套接字一起使用在本地网络上?

现在,一件事是大多数学生都使用 Flash CSx 版本——另一方面,我在 Linux 上,所以我尝试制作一个 Flex 示例;所以我将示例作为 Flex 代码提供,但我也想知道 Flash CS 环境的可能答案。目录结构、编译行和代码在本文末尾给出 - 但“应用程序”目录如下所示:

rgaltest_dir.png


好的,所以这里是更详细的问题。首先,我想我会尝试读取目录内容 - 所以我在这里尝试了代码:AS3 Basics: List all files in a folder including subdirectories (AIR ... on students' Flash CS - 但这似乎失败了。

所以我想 - 好吧,那么让我们在 .swf 所在的同一目录中放入一个文本文件,其中将包含图像列表;例如

cat > fileslist.txt <<EOF
img/01.jpg
img/02.jpg
EOF

然后,Flash 应用程序将首先读取此文件 - 然后继续从内容中选择一个随机图像。但在第一刻,我得到:

An ActionScript error has occurred:
SecurityError: Error #2148: SWF file file:///home/rgaltest/rgaltest.swf cannot access local resource file:///home/rgaltest/fileslist.txt. Only local-with-filesystem and trusted local SWF files may access local resources.
  at flash.net::URLStream/load()
  at flash.net::URLLoader/load()
  at rgaltest()[/home/rgaltest/rgaltest.as:23]

所以,这个问题的答案似乎是:

现在,我不想拥有--use-network=false因为学生可能需要在该示例中集成其他基于网络的东西。然后,如果您在浏览器中打开 SWF,然后右键单击,然后选择“全局设置”,则会显示类似于“ settings_manager04.html”(“全局安全设置面板”)页面的内容 - 但它是否适用于显示的 SWF 文件作为 Ctrl-Enter 在 Flash CS 中构建的一部分(或相应地,那些打开的flashplayerdebugger?)所以我尝试一下 - 选择“编辑位置”,“浏览文件夹”,/home/rgaltest在“始终允许”下选择:

flash_settings

...现在fileslist.txt加载好了;当 .swf 与flashplayerdebugger.

对,所以现在加载了文件列表,我将继续加载位图..所以我添加了相应的代码(使用onImgLoaded等),这就是我在日志中得到的:

At frame #1
file onTextLoaded: img/01.jpg,img/02.jpg,
At frame #2
file onImgLoaded: [object URLLoader]
TypeError: Error #1034: Type Coercion failed: cannot convert "ÿØÿà
...
¿ÿÙ" to flash.display.Bitmap.
  at rgaltest/onImgLoaded()[/home/rgaltest/rgaltest.as:64]
  at flash.events::EventDispatcher/dispatchEventFunction()
  at flash.events::EventDispatcher/dispatchEvent()
  at flash.net::URLLoader/onComplete()
At frame #3
At frame #4
...

有趣的是——图像确实被读取了——因为它的所有二进制内容都被转储到了日志中!然而,它不能被解释为位图数据???!


首先,这是我的目录布局:

mkdir /home/rgaltest
cd /home/rgaltest
touch rgaltest.as
touch fileslist.txt
mkdir img
cd img
convert -size 320x240 gradient:\#4b4-\#bfb 01.jpg
convert -size 320x240 gradient:\#b44-\#bff 02.jpg
chmod -R 777 /home/rgaltest   # to ensure no problem with file permissions

下面rgaltest.as给出; 我编译它:

/path/to/flex_sdk_4.6.0.23201_mpl/bin/mxmlc -static-link-runtime-shared-libraries -use-network=true -verbose-stacktraces -debug=true rgaltest.as

...并且我在本地检查(确保mm.cfg已正确设置,另请参阅使用 Flash Player 调试器):

# in one terminal:
tail -f ~/.macromedia/Flash_Player/Logs/flashlog.txt

# in another terminal:
/path/to/flashplayer_11/flashplayerdebugger rgaltest.swf

 

最后,这里是rgaltest.as

package {
  import flash.display.Sprite;
  import flash.text.TextField;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.IEventDispatcher;
    import flash.net.*; //URLLoader;
    import flash.display.Bitmap;
    import flash.display.BitmapData;

    [SWF(width="550", height="400")]
    public class rgaltest extends MovieClip {

    public var _pictureArray:Array;
    public var frameCnt:Number = 0;

    public var myTextLoader:URLLoader;
    public var isFileslistLoaded:Boolean = false;

    public var myImgLoader:URLLoader;
    public var isImgLoading:Boolean = false;


        // constructor - create/initialize objects here
        public function rgaltest() {
      this.stage.frameRate = 10; // frames per second

      // load the text file with image list
      myTextLoader = new URLLoader();
      myTextLoader.addEventListener(Event.COMPLETE, onTextLoaded);
      myTextLoader.load(new URLRequest("fileslist.txt"));

            // add event listener for onEnterFrame
            configureListeners(this);
    }

    private function configureListeners(dispatcher:IEventDispatcher):void {
      dispatcher.addEventListener(Event.ENTER_FRAME, my_OnEnterFrame);
        }

    public function onTextLoaded(e:Event):void {
      _pictureArray = e.target.data.split(/\n/);
      trace("file onTextLoaded: " + _pictureArray);
      isFileslistLoaded = true;
    }

        public function my_OnEnterFrame(event:Event):void {
      frameCnt++;
      trace("At frame #" + frameCnt);
      if (isFileslistLoaded) {
        if (!isImgLoading) {
          //load a random image
          var rndChoice:Number = Math.floor(Math.random()*2) + 1;
          myImgLoader = new URLLoader();
          myImgLoader.addEventListener(Event.COMPLETE, onImgLoaded);
          myImgLoader.load(new URLRequest(_pictureArray[rndChoice]));
          isImgLoading = true;
        }
      }
    } // end onEnterFrame

    public function onImgLoaded(e:Event):void {
      trace("file onImgLoaded: " + e.target);
      var _image:Bitmap = Bitmap(e.target.data);
      var _bitmap:BitmapData = _image.bitmapData;
      addChild(_image);
    }

  } //end class
} //end package

其他一些相关链接:

4

1 回答 1

1

凹凸 - 似乎我解决了位图加载问题(将其放在单独的帖子中,这样我就不会过多地阻塞 OP);我只是用Loaderclass 而不是URLLoader; 请参见下面的代码(还要注意 OP 中随机计算的错误,下面已更正)。

无论如何 - 事情就是这样:当我Loader在学生的 Flash CSx 上尝试课程时,它往往会惨遭失败!但是,也许那是因为在那些情况下,我们没有从“ settings_manager04.html”授予文件夹的任何权限?当在 Flash 中生成类似这样的代码时,有什么特别需要注意的吗?

这是重做的rgaltest.as

package {
  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.events.IEventDispatcher;
  import flash.net.*; //URLLoader;
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.Loader; //*

  [SWF(width="550", height="400")]
  public class rgaltest extends MovieClip {

    public var _pictureArray:Array;
    public var frameCnt:Number = 0;

    public var myTextLoader:URLLoader;
    public var isFileslistLoaded:Boolean = false;

    public var myImgLoader:Loader;
    public var isImgLoading:Boolean = false;


    // constructor - create/initialize objects here
    public function rgaltest() {
      this.stage.frameRate = 10; // frames per second

      // load the text file with image list
      myTextLoader = new URLLoader();
      myTextLoader.addEventListener(Event.COMPLETE, onTextLoaded);
      myTextLoader.load(new URLRequest("fileslist.txt"));

      // add event listener for onEnterFrame
      configureListeners(this);
    }

    private function configureListeners(dispatcher:IEventDispatcher):void {
      dispatcher.addEventListener(Event.ENTER_FRAME, my_OnEnterFrame);
    }

    public function onTextLoaded(e:Event):void {
      _pictureArray = e.target.data.split(/\n/);
      trace("file onTextLoaded: " + _pictureArray);
      isFileslistLoaded = true;
    }

    public function my_OnEnterFrame(event:Event):void {
      frameCnt++;
      trace("At frame #" + frameCnt);
      if (isFileslistLoaded) {
        if (!isImgLoading) {
          //load a random image
          var rndChoice:Number = Math.floor(Math.random()*2) + 0;
          trace("Loading: " + rndChoice + " / " + _pictureArray[rndChoice]);
          myImgLoader = new Loader();
          myImgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImgLoaded);
          myImgLoader.load(new URLRequest(_pictureArray[rndChoice]));

          isImgLoading = true;
        }
      }
    } // end onEnterFrame

    public function onImgLoaded(e:Event):void {
      trace("file onImgLoaded: " + e.target);
      var _image:Bitmap = Bitmap(myImgLoader.content);
      var _bitmap:BitmapData = _image.bitmapData;
      addChild(_image);
    }

  } //end class
} //end package
于 2012-04-20T10:12:33.180 回答