我希望我可以帮助解决我的动作问题。
(inb4:'你究竟想要完成什么(除了在没有用户许可的情况下打开任意文件)?'link )
我正在努力协助学生练习 - 所以我想我会想出一个随机画廊的例子。这样的想法是学生将能够生成SWF文件,并且在同一目录中,他们将有一个带有图像的文件夹。然后SWF电影将读取目录的内容;选择随机图像,然后显示它。
我希望这可以在本地(当学生开发时)完成 - 并且,如果他们选择这样做,他们应该能够在线上传整个目录 - 并且希望这个例子能够以任何方式工作。事实并非那么容易 - 所以这些是我的问题:
flashplayerdebugger
- 如果它使用AIR,我应该调用它来重现SWF?
settings_manager04.html
- 但您希望使用Flash应用程序本地文件和本地网络上的网络套接字? 现在,有一件事是大多数学生使用Flash CSx版本 - 另一方面我在Linux上,所以我试图制作一个Flex示例;所以我提供了示例作为Flex代码,但我也想知道Flash CS环境的可能答案。目录结构,编译行和代码在本文末尾给出 - 但这里是“application”目录的样子:
好的,所以这里有更详细的问题。首先,我想我会尝试阅读目录内容 - 所以我在这里尝试了代码:AS3 Basics: List all files in a folder including subdirectories (AIR ...学生的Flash CS - 但这似乎很难失败。
所以我想 - 好吧,然后让我们把一个文本文件放在与.swf相同的目录中,它将包含一个图像列表; e.g。
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文件在Flash CS中显示为Ctrl-Enter构建的一部分(或者相应地,那些用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
已正确设置,另请参阅Solution – Error #2010: Local-with-filesystem SWF files are not permitted to use sockets. » Mark Lapasa ):
# 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
其他一些相关链接:
答案 0 :(得分:1)
Bump - 似乎我解决了位图加载问题(将它放在单独的帖子中,这样我就不会过多地阻塞OP);我刚使用Loader
类而不是URLLoader
;请参阅下面的代码(还注意OP中随机计算中的错误,在下面进行了更正)。
无论如何 - 这就是事情:当我在学生的Flash CSx上尝试Loader
课程时,它往往会悲惨地失败!但是,也许那是因为在这些情况下,我们没有从“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