2

私のアクションスクリプトの問題で助けが得られることを願っています。

(inb4: 「(ユーザーの許可なしに任意のファイルを開く以外に) 正確に何を達成しようとしていますか?」リンク)

私は学生の演習を支援しようとしているので、ランダムなギャラリーの例を思いつくと思いました. これは、学生が SWF ファイルを生成できるようにし、同じディレクトリに画像を含むフォルダを作成できるようにするというものです。次に、SWF ムービーがディレクトリの内容を読み取ります。ランダムに画像を選んで表示します。

私は、これがローカルで (学生が開発している間) 両方で実行できることを望んでいました (学生がそのように選択した場合は、ディレクトリ全体をオンラインでアップロードできる必要があります)。それはそれほど簡単ではないことが判明しました-それで、これらは私の質問です:

  • 彼らは、ローカル ディレクトリの一覧を取得するには、AIR を使用する必要があると言っていますが、これはどういう意味ですか? SWF が AIR を使用している場合、SWF を再現するために呼び出す必要がある実行可能ファイルはありますflashplayerdebuggerか?
    • この AIR を使用せずにローカル ディレクトリの一覧を取得することはできますか (以下の Flex コードと同様に?)
  • ローカルのテキスト ファイルを読み込めるようです。しかし、ローカルのビットマップ ファイルを読み込めません。ビットマップファイルもロードできますか?
  • たまたまインターネットにアクセスできないため、アクセスできない場合、ファイル/フォルダーにローカルアクセス許可を与えるにはどうすればよいですか?settings_manager04.htmlしかし、ローカルファイルとネットワークソケットの両方でFlashアプリケーションを使用したいローカルネットワークで?

さて、1 つのことは、ほとんどの学生が Flash CSx バージョンで作業しているということです。一方、私は Linux を使用しているので、Flex の例を作成しようとしました。そのため、サンプルを Flex コードとして提供しましたが、Flash CS 環境についても可能な回答を知りたいです。ディレクトリ構造、コンパイル行、およびコードはこの記事の最後に記載されていますが、「アプリケーション」ディレクトリは次のようになります。

rgaltest_dir.png


わかりましたので、ここで問題をもう少し詳しく説明します。最初に、ディレクトリの内容を読み取ろうと思ったので、次のコードを試しました。

それで私は考えました-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]

したがって、これに対する答えは次のようです。

今、私はそうしたくありません--use-network=false学生はその例で他のネットワークベースのものを統合する必要があるかもしれないからです. 次に、ブラウザーで SWF を開き、右クリックして [グローバル設定] を選択すると、その " settings_manager04.html" ("グローバル セキュリティ設定パネル") ページに似たページが表示されますが、表示されている SWF ファイルに対しては機能しますか? Flash CS での Ctrl-Enter ビルドの一部として (または、それに応じて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

...そして、ローカルで確認します(適切に設定されていることを確認してください。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

その他の関連リンク:

4

1 に答える 1

1

バンプ-ビットマップの読み込みを解決したようです(OPをあまり詰まらせないように、ここに別の投稿に入れます)。;Loaderの代わりにクラスを使用しました。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 に答える