AS3でNow loading…なローディング(フレームアクション)

AS3で読み込みを作るとき、LoaderInfoのProgressEventで書こうが、Event.ENTER_FRAMEで書こうが、なぜか100%になったときしか処理が動かなくて、途中の読み込み状況がまったく出ません。なんでだよ。

stop();
var loadInfo:LoaderInfo = this.loaderInfo;
loadInfo.addEventListener(ProgressEvent.PROGRESS, nowloading);
loadInfo.addEventListener(Event.COMPLETE, onloaded);
function nowloading(event:ProgressEvent):void{
var per:uint = Math.floor(event.target.bytesLoaded / event.target.bytesTotal * 100);
trace(per);
};
function onloaded(event:Event):void {
trace("complete");
};
stop();
this.addEventListener(Event.ENTER_FRAME, checkBytes);
function checkBytes(e:Event){
var per = this.loaderInfo.bytesLoaded / this.loaderInfo.bytesTotal * 100;
if (per >= 100) {
complete();
}
trace(per)
}
function complete() {
this.removeEventListener(Event.ENTER_FRAME, checkBytes);
trace("complete")
}

出力結果

comp
100

追記。5iveさまに教えていただきました!! これでOK。

stop()
var info : LoaderInfo = root.loaderInfo;
root.addEventListener(Event.ENTER_FRAME,EnterFrameFunc);
function EnterFrameFunc(event){
var per:uint =Math.floor(info.bytesLoaded / info.bytesTotal * 100)
trace(per)
if(info.bytesLoaded == info.bytesTotal){
trace("comp");
root.removeEventListener(Event.ENTER_FRAME,EnterFrameFunc);
}
}

root.addEventListenerでも、stage.addEventListener でも大丈夫です。

こちらを読んでおくといい感じ

基本からしっかりわかるActionScript 3.0 (Web Designing BOOKS) |
ActionScript 3.0 基本が身につくケーススタディ |
プロからやさしく学ぶ ActionScript 3.0

この記事には、カテゴリ AS3 タグは , , がつけられています。

AS3でNow loading…なローディング(フレームアクション) への10件のフィードバック

  1. simo より:

    はじめまして。
    確か読み込み途中のProgressを捕まえるにはcontentLoaderInfoプロパティに対してリスナーを監視しなければいけなかったと思いますよ。こちらが参考になるかと思います。

  2. sho-T より:

    ryowさん、ご無沙汰してます。
    コンボボックスのリスト追加でお世話になりました。
    さて、ナウローディングですが、まだ慣れてませんが自分でも考えてみたりネットで調べて他の方のアイデアも参考にしてみましたが、やはり読み込み後に「100」が表示されてしまい、途中経過が表示されません。いったい何で??プログレスバーならばできるようなことは聞いたような気がしますが・・・。
    それと言いにくいことですが、AS3.0を色々といじっていて壁にぶつかってしまいかなり凹んでいます。知恵と勇気を与えてください!
    内容は「閲覧者にFlash(AS3.0)で作成されたページをJPEG画像としてダウンロードさせる」ためのスクリプトです。
    ページ内には、他から入力されたダイナミックテキストや選択済みのコンボボックスも含んでいる場合を想定しています。
    Flashファイルとは別にASファイルに「packege{」から書き始めることは理解していますが、「adobe JPGEncoder」や「php」等と自分にとっては未知の領域で白紙です。
    どうすればよいのでしょうか??

  3. ryow より:

    >simoさま
    ありがとうございます!ASの勉強はまずhakuhinから、と言われる通り、参考にさせていただきます。rootの場合はroot.loaderInfoで、Loaderで読む外部ファイルはcontentLoaderInfoを使う、という意識だけありました。
    ブログも拝読さしてもらってます~
    >sho-Tさま
    ご無沙汰です。
    jpgエンコーダはAdobeのナイスなライブラリです。
    google code(http://code.google.com/p/as3corelib/downloads/list)に上がってると思います。
    手順は…面倒ですが…画面をbitmapとしてキャプチャして、JPGエンコーダにデータを渡してjpg化(この時点ではByteArray)、それをPHPに投げてjpgにしてダウンロードする、というものです(Player9までは直接ダウンロードできないのでPHP経由します)。
    Player10から、FileReferenceが変わって、ダウンロードにはPHPがいらなくなったようですよ!
    なので「画面キャプチャ機能」「保存機能」「ダウンロード機能」を作ればよさげかと思います。package、というのはクラス書くときです。無理やりフレームアクションにすることもできなくないので、手がつけられそうな部分からやっていけば大丈夫だと思いますよ!

  4. sho-T より:

    ryowさん、ありがとうございます。
    画面キャプチャは、入力されたダイナミックテキストや選択されたコンボボックスもキャプチャできるのですか?
    ちょっとばかりうまく書き込めないです・・・。

  5. sho-T より:

    こんばんは。
    色々と参照しながら頑張ってみて、下記のようなスクリプトができましたがエラーがでます。しかしどこがマズイか理解できてないです。どうしましょう?
    フレームに書き込んでいます。
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import com.adobe.images.JPGEncoder;
    var bmp_data : BitmapData = new BitmapData( 400 , 600 , true , 0xFFFFFFFF);
    var bmp_obj : Bitmap = new Bitmap( bmp_data , PixelSnapping.AUTO , true);
    stage.addChild(bmp_obj);
    bmp_obj.x = 600;
    bmp_obj.y = 0;
    var matrix : Matrix = new Matrix(1,0,0,1,0,0);
    var color : ColorTransform = new ColorTransform(1,1,1,1,0,0,0,0);
    var rect : Rectangle = new Rectangle(0,0,400,600);
    Upload_btn.addEventListener(MouseEvent.CLICK, cap);
    function cap(event:MouseEvent){
    bmp_data.draw(stage, matrix, color, BlendMode.NORMAL, rect, true);
    }
    var CGIPath:String = “http://EXAMPLE.com/save.php”;
    function sendData(src:BitmapData):void{
    var jpge:JPGEncoder = new JPGEncoder(90);
    var byteArr:ByteArray = JPGEncoder.encode(bmp_data);
    var urlRequest:URLRequest = new URLRequest();
    urlRequest.url = CGIPath;
    urlRequest.contentType = “application/octet-stream”;
    urlRequest.method = URLRequestMethod.POST;
    urlRequest.data = byteArr;
    var urlLoader:URLLoader = new URLLoader();
    urlLoader.addEventListener(Event.COMPLETE, onUpload);
    urlLoader.load(urlRequest);
    }
    function download(str:String):void{
    var dlp:DownloadFile = new DownloadFile(dlURL,str);
    }

  6. ryow より:

    sho-Tさま
    こんにちは。
    ほぼ出来てると思います…あとはエラーを見ていけばいいだけではないでしょうか?
    僕がこれを参考にカンタンなサンプルを作ってみましたのでよろしければご参考くださいませ。
    http://ryow.net/blog_old/2009/04/05-143554.php

  7. Takeo より:

    はじめまして。
    stop()
    var info : LoaderInfo = root.loaderInfo;
    root.addEventListener(Event.ENTER_FRAME,EnterFrameFunc);
    function EnterFrameFunc(event){
    var per:uint =Math.floor(info.bytesLoaded / info.bytesTotal * 100)
    trace(per)
    if(info.bytesLoaded == info.bytesTotal){
    trace(“comp”);
    root.removeEventListener(Event.ENTER_FRAME,EnterFrameFunc);
    }
    }
    でも、やはり、100%になっから、表示されまして、途中経過が表示されないようです。。。
    何が原因でしょうか?

  8. ryow より:

    >Takeoさま
    おおっと。
    そうなんですよね。。
    色々試したんですが、どうやら「別ファイルを読み込むときは使える」けど「自身を読み込む時はダメ」みたいな感じです。
    しょうがないので、僕の場合は読み込み専用のswfを作り、そいつが本体を読み込むようにしました。

  9. Takeo より:

    ryow様
    その後、いろいろ試しまして、ローディングができました。
    下記に、ローディングの部分だけ書きます。
    横一本のバーがスケールで伸びて、ダイナミックテキストが0~100までカウントするだけのものです。
    もし、判らなかったら、メールいただければ、ソースをお送りします。(多分、お解かりになるとおもいますが、、、)
    stop();
    addEventListener(Event.ENTER_FRAME,loaderF);
    function loaderF(e:Event):void{
    var total:Number = loaderInfo.bytesTotal; //ロードされる合計サイズ
    var loaded:Number = loaderInfo.bytesLoaded; //ロードされたサイズ
    var percentage:Number = loaded/total; //ロードされた割合
    if(loaded == total){
    removeEventListener(Event.ENTER_FRAME,loaderF);
    gotoAndStop(2);
    }
    else{
    preloader_mc.bar_mc.scaleX = percentage;
    preloader_mc.percent_text.text = Math.floor(percentage*100)+”%”;
    trace(percentage*100); //確認用
    }
    }

  10. ryow より:

    うーん。なるほど!解決してよかったですー!
    なんだか、やってることはエントリで書いてるのと同じ方法のような気もしますが、作り方の違いなんですかね。?