私のアクションスクリプトの問題で助けが得られることを願っています。
(inb4: 「(ユーザーの許可なしに任意のファイルを開く以外に) 正確に何を達成しようとしていますか?」リンク)
私は学生の演習を支援しようとしているので、ランダムなギャラリーの例を思いつくと思いました. これは、学生が SWF ファイルを生成できるようにし、同じディレクトリに画像を含むフォルダを作成できるようにするというものです。次に、SWF ムービーがディレクトリの内容を読み取ります。ランダムに画像を選んで表示します。
私は、これがローカルで (学生が開発している間) 両方で実行できることを望んでいました (学生がそのように選択した場合は、ディレクトリ全体をオンラインでアップロードできる必要があります)。それはそれほど簡単ではないことが判明しました-それで、これらは私の質問です:
- 彼らは、ローカル ディレクトリの一覧を取得するには、AIR を使用する必要があると言っていますが、これはどういう意味ですか? SWF が AIR を使用している場合、SWF を再現するために呼び出す必要がある実行可能ファイルはあります
flashplayerdebugger
か?- この AIR を使用せずにローカル ディレクトリの一覧を取得することはできますか (以下の Flex コードと同様に?)
- ローカルのテキスト ファイルを読み込めるようです。しかし、ローカルのビットマップ ファイルを読み込めません。ビットマップファイルもロードできますか?
- たまたまインターネットにアクセスできないため、アクセスできない場合、ファイル/フォルダーにローカルアクセス許可を与えるにはどうすればよいですか?
settings_manager04.html
しかし、ローカルファイルとネットワークソケットの両方でFlashアプリケーションを使用したいローカルネットワークで?
さて、1 つのことは、ほとんどの学生が Flash CSx バージョンで作業しているということです。一方、私は Linux を使用しているので、Flex の例を作成しようとしました。そのため、サンプルを Flex コードとして提供しましたが、Flash CS 環境についても可能な回答を知りたいです。ディレクトリ構造、コンパイル行、およびコードはこの記事の最後に記載されていますが、「アプリケーション」ディレクトリは次のようになります。
わかりましたので、ここで問題をもう少し詳しく説明します。最初に、ディレクトリの内容を読み取ろうと思ったので、次のコードを試しました。
それで私は考えました-OK、それでは、画像のリストを含む.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 " (ファイルシステムおよび信頼できるローカル SWF ファイルは、ローカル リソースにアクセスできます。 )
- "解決策は、プロジェクトの /bin-debug ディレクトリにある swfs を信頼するように Flash Player を設定することであることがわかりました... 1) http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04に移動します.html ... " (解決策 – エラー #2010: Local-with-filesystem SWF ファイルはソケットの使用を許可されていません。 » Mark Lapasa )
今、私はそうしたくありません--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
...そして、ローカルで確認します(適切に設定されていることを確認してください。Flash Playerデバッガーの使用も参照してくださいmm.cfg
):
# 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
その他の関連リンク: