我希望我能在我的动作脚本问题上得到一些帮助。
(inb4:'你到底想完成什么(除了在未经用户许可的情况下打开任意文件)?'链接)
我正在尝试协助学生练习 - 所以我想我会想出一个随机画廊的例子。这样做的想法是学生将能够生成一个 SWF 文件,并且在同一目录中,他们将拥有一个包含图像的文件夹。然后 SWF 电影将读取目录的内容;选择一个随机图像,并显示它。
我希望这可以在本地完成(在学生发展的同时)——而且,如果他们选择这样做,他们应该能够在线上传整个目录——并且希望该示例能够以任何方式工作。事实证明这并不容易 - 所以这些是我的问题:
- 他们说,为了获得本地目录列表,我应该使用 AIR - 这是什么意思?如果它使用 AIR ,是否有一些可执行文件 -除了
flashplayerdebugger
- 我应该调用以重现 SWF?- 是否可以在不使用此 AIR 的情况下获取本地目录列表(类似于下面的 Flex 代码?)
- 看来我可以加载本地文本文件;但我无法加载本地位图文件。是否也可以加载位图文件?
- 如果碰巧您无法访问 Internet,因此您无法访问,您如何授予文件/文件夹的本地访问权限
settings_manager04.html
- 但您希望将 Flash 应用程序与本地文件和网络套接字一起使用在本地网络上?
现在,一件事是大多数学生都使用 Flash CSx 版本——另一方面,我在 Linux 上,所以我尝试制作一个 Flex 示例;所以我将示例作为 Flex 代码提供,但我也想知道 Flash CS 环境的可能答案。目录结构、编译行和代码在本文末尾给出 - 但“应用程序”目录如下所示:
好的,所以这里是更详细的问题。首先,我想我会尝试读取目录内容 - 所以我在这里尝试了代码: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]
所以,这个问题的答案似乎是:
- "如果您在使用 flash.net.URLLoader 和免费的 flex 编译器时遇到该错误,请在编译时添加以下选项以使您的 swf 工作:-use-network=false " ( juicy tidbits - Only local-with-文件系统和受信任的本地 SWF 文件可以访问本地资源。)
- "原来解决方案是配置您的 Flash Player 以信任项目的 /bin-debug 目录中的 swfs ... 1) 转到http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04 .html ... "(解决方案 – 错误 #2010:本地文件系统 SWF 文件不允许使用套接字。» Mark Lapasa)
现在,我不想拥有--use-network=false
因为学生可能需要在该示例中集成其他基于网络的东西。然后,如果您在浏览器中打开 SWF,然后右键单击,然后选择“全局设置”,则会显示类似于“ settings_manager04.html
”(“全局安全设置面板”)页面的内容 - 但它是否适用于显示的 SWF 文件作为 Ctrl-Enter 在 Flash CS 中构建的一部分(或相应地,那些打开的flashplayerdebugger
?)所以我尝试一下 - 选择“编辑位置”,“浏览文件夹”,/home/rgaltest
在“始终允许”下选择:
...现在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
其他一些相关链接: