トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ローディングの際、読込状況パーセントを表示する方法について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
miyaryu
Åê¹ÆNo.42992
投稿日時: 2009-7-23 0:15
常連
居住地:
投稿: 79
使用環境:
windowsXP,flash CS4
ローディングの際、読込状況パーセントを表示する方法について
先般、回答して頂きましたプログレスローダーの読込状況の表示についてにて、読込状況表示ができたのですが、肝心な読込状況パーセントが0%指示から一気に100%表示されてしまいます。
読込容量が少ないせいかと思いましたが、デバッグすると一回のプログレスイベントループでは約5%の頻度でロードしており、その際のプログレスバー読込状況ダイナミックテキストは、0%のままでした。
ちなみに読込状況のプログレスバーの構成は前記のダイナミックテキストに加えて、円形のバーを回転させることで、視覚的に表示しており、これはライブラリ上に登録してあり、クラス化してProgressLoaderImageクラスにて使用しています。
このロード状況はEnter_FRAMEイベントにて起こしており、回転バーはうまく回転し、ロード終了とともに表示リストから消去しています。デバッグすると読込状況がonProgressToファンクションに渡されていないような表示も出ます。
一応、予測ですがProgressLoaderクラスのPROGRESS_EVENTにて読み込んでいるにも関わらず、さらにProgressLoaderImageクラス内でENTER_FRAMEイベントを起こすこと自体が、まずいのかなと思ったりしますが、どうでしょうか?何か良案等あればご教授ください。

ProgressLoader.as(ローディング本体クラス)

		private function onProgress(e:ProgressEvent):void {
			var _loadPercent:int = Math.round(e.bytesLoaded / e.bytesTotal * 100);
			_bytesLoaded = e.bytesLoaded;
			_bytesTotal = e.bytesTotal;
			progressBar.onProgress(_loadPercent,_bytesLoaded,_bytesTotal);
		}


ProgressLoaderImage.as(ローダーバー動作用クラス)

        public function onProgress ( _loadPercent:int,_bytesLoaded:int,_bytesTotal:int ):void {
			addEventListener ( Event.ENTER_FRAME, onProgressTo );
		}

		private function onProgressTo (e:Event):void {
			trace (_loadPercent);	
		    if (_loadPercent > 99) {
				removeEventListener ( Event.ENTER_FRAME, onProgressTo );
			}
			spin.rotation += 30;//回転インスタンス
			_percent.text="NOW LOADING... "+_loadPercent+" %";//ダイナミックテキスト
		}
野中文雄
Åê¹ÆNo.42994
投稿日時: 2009-7-23 2:09
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ローディングの際、読込状況パーセントを表示する方法について
少なくとも、引用のスクリプトからは、受取った引数(「読込状況」?)をそのままスルーしているように見受けられます。また、「ProgressLoaderImageクラス内でENTER_FRAMEイベントを起こすこと」はされておらず、単にイベントリスナーを「登録」しているだけです。

ProgressLoaderImage.onProgressTo()メソッドは、変数_loadPercentをどうやって受取っているのですか。そして、この値はProgressLoaderクラスからどのように更新されているのでしょう?
引用:
miyaryuさんは書きました:
読込容量が少ないせいかと思いましたが、デバッグすると一回のプログレスイベントループでは約5%の頻度でロードしており、その際のプログレスバー読込状況ダイナミックテキストは、0%のままでした。
...[中略]...
このロード状況はEnter_FRAMEイベントにて起こしており、回転バーはうまく回転し、ロード終了とともに表示リストから消去しています。デバッグすると読込状況がonProgressToファンクションに渡されていないような表示も出ます。
一応、予測ですがProgressLoaderクラスのPROGRESS_EVENTにて読み込んでいるにも関わらず、さらにProgressLoaderImageクラス内でENTER_FRAMEイベントを起こすこと自体が、まずいのかなと思ったりしますが、どうでしょうか?何か良案等あればご教授ください。

ProgressLoader.as(ローディング本体クラス)
private function onProgress(e:ProgressEvent):void {
	// ...[中略]...
	progressBar.onProgress(_loadPercent, _bytesLoaded, _bytesTotal);
}


ProgressLoaderImage.as(ローダーバー動作用クラス)
public function onProgress
	(_loadPercent:int, _bytesLoaded:int, _bytesTotal:int):void {
	addEventListener(Event.ENTER_FRAME, onProgressTo);
}

private function onProgressTo(e:Event):void {
	trace(_loadPercent);	
	// ...[中略]...
	_percent.text="NOW LOADING... "+_loadPercent+" %";  //ダイナミックテキスト
}


----------------
 

miyaryu
Åê¹ÆNo.42997
投稿日時: 2009-7-23 10:06
常連
居住地:
投稿: 79
使用環境:
windowsXP,flash CS4
Re: ローディングの際、読込状況パーセントを表示する方法について
引用:

Fumioさんは書きました:
少なくとも、引用のスクリプトからは、受取った引数(「読込状況」?)をそのままスルーしているように見受けられます。また、「ProgressLoaderImageクラス内でENTER_FRAMEイベントを起こすこと」はされておらず、単にイベントリスナーを「登録」しているだけです。

ProgressLoaderImage.onProgressTo()メソッドは、変数_loadPercentをどうやって受取っているのですか。そして、この値はProgressLoaderクラスからどのように更新されているのでしょう?


まず、一番目のご質問ですが、次のとおり修正しました。
イベントリスナーに引数を渡す方法を検索して、ご覧のとおりのコーディングとしました。
すると、コード中のtrace(per)にて値が渡されていることを確認できました。
しかし、やはりステージ上に登録されたプログレスバー読込状況ダイナミックテキストには、反映されません。
デバッグ状況では、per変数に反映されているのに実際の表示は0%から100%に突然切り替わります。

public function onProgress ( _loadPercent:int,_bytesLoaded:int,_bytesTotal:int ):void {
	addEventListener ( Event.ENTER_FRAME, onProgressTo(_loadPercent) );
}

public function onProgressTo (per:int):Function {
	return function(e:Event):void{
		trace(per)
		spin.rotation += 30;
		_percent.text="NOW LOADING... "+per+" %";
	}
}


次に二番目のご質問についてですが、下記のように引数pathにパスを渡してやり、以後Loaderクラスを使用してProgressEventにてonProgressメソッドを登録しています。
構想としては、初期設定としてローディングの設定及びプログレスバーの登録を済ませて、あとはProgressEventにてProgressLoaderImageに読み込み状況を渡すということです。

// コンストラクタ:
public function ProgressLoader (path:String) {
	_loader = new Loader  ;

	//ローダーイベント
	_loaderInfo = _loader.contentLoaderInfo;
	_loaderInfo.addEventListener (ProgressEvent.PROGRESS,onProgress,false,0,true);

	//プログレスローダーイメージ表示
	_progressBar = new ProgressLoaderImage();
	addChild (_progressBar)
	
	//同期型エラー処理
	try {
		_loader.load (new URLRequest(path));
	} catch (err:Error) {
		trace ("ドキュメントをロードできません:\n"+err.message);
	}
}

//プログレスローダー
private function onProgress (e:ProgressEvent):void {
	var _loadPercent:int = Math.round(e.bytesLoaded / e.bytesTotal * 100);
	_bytesLoaded = e.bytesLoaded;
	_bytesTotal = e.bytesTotal;
	_progressBar.onProgress (_loadPercent,_bytesLoaded,_bytesTotal);
}


野中文雄
Åê¹ÆNo.43007
投稿日時: 2009-7-24 4:40
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ローディングの際、読込状況パーセントを表示する方法について
引数を関数(メソッド)呼出し時に渡す変数と定義するなら、リスナー関数(メソッド)にイベントオブジェクト以外の引数は渡せません。利用されたテクニックは、引数を渡した気分になるだけのものです。それを理解したうえであえてお使いになることは止めませんけど、個人的にはそのメリットを感じません。

第1に、前述の意味での引数ではありませんから、リスナーの呼出し時にその値が変わりません。その問題を避けるために、miyaryuさんは繰返しイベントリスナーの登録をされているのかもしれません。しかし、処理に無駄な負荷が加わるうえ、それよりももっと大きな問題を生んでいます。以下のサンプルスクリプトでステージをゆっくりクリックしながら、その[出力]の変化をよくお確かめください。

参考:「関数クロージャ内のthis参照について
// フレームアクション
var count:uint = 0;
stage.addEventListener(MouseEvent.CLICK, onClick);
function onClick(eventObject:MouseEvent):void {
	var _date:Date = new Date();
	trace(_date);
	addEventListener(Event.ENTER_FRAME, onProgressTo(_date));
}
function onProgressTo(_date:Date):Function {
	var myCount:uint = count++;
	return function(e:Event):void{
		trace(myCount, new Date().time, _date.time, this)
	}
};


第2に、名前のない関数をイベントリスナーとして登録すると、その削除が面倒でしょう。

onProgress()メソッドから普通にメソッドonProgressTo()を呼出し、引数を渡したのではダメなのですか?インスタンスspinを回したいなら、その処理だけを1度DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)のリスナーに登録すればよさそうに思えます。
引用:
miyaryuさんは書きました:
イベントリスナーに引数を渡す方法を検索して、ご覧のとおりのコーディングとしました。
すると、コード中のtrace(per)にて値が渡されていることを確認できました。
しかし、やはりステージ上に登録されたプログレスバー読込状況ダイナミックテキストには、反映されません。
デバッグ状況では、per変数に反映されているのに実際の表示は0%から100%に突然切り替わります。
public function onProgress ( _loadPercent:int,_bytesLoaded:int,_bytesTotal:int ):void {
	addEventListener ( Event.ENTER_FRAME, onProgressTo(_loadPercent) );
}

public function onProgressTo (per:int):Function {
	return function(e:Event):void{
		trace(per)
		spin.rotation += 30;
		_percent.text="NOW LOADING... "+per+" %";
	}
}


----------------
 

miyaryu
Åê¹ÆNo.43023
投稿日時: 2009-7-27 14:48
常連
居住地:
投稿: 79
使用環境:
windowsXP,flash CS4
Re: ローディングの際、読込状況パーセントを表示する方法について
野中さまの示されたスクリプトを実行してみたところ、これは一つのデータ(ここでは読込状況%)を更新するという意味とは異なりますよね。1%、1%2%、1%2%3%・・・と、一度表示した過去のデータまでも計算するハメになってしまい、本当に負担が大きいことが分かりました。
そこで、初心にかえり読込状況%は、普通にメソッドで行い、回転作業はEnterFrameイベントを使うことにしたのですが、やはり読込状況%だけは、0から100に変わるだけです。
にゃあプロジェクトさんのProgressBarコンポーネントに挑戦! (1)にて検証を行ったのですが、私と同様な状況が起こりました。つまり、ローディングバーはスライドするのですが、%表記されないということです。これは、スクリプト上の問題なのでしょうか?それともサーバーとローカルの違いなのでしょうか?
下記コードは、野中さまのおっしゃるような方法に改造しました。

		//プログレスローダークラスからの受取用
		public function onProgress (p:Number, t:Number):void {
			tTotal.text = Math.ceil(t / 1024) + "KB";
			_targetPercent = p;
			onProgressText (p);
			addEventListener ( Event.ENTER_FRAME, onProgressTo, false, 0, true);
		}

		//表記用
		private function onProgressText (_targetPercent:int):void {
			_percent += (_targetPercent - _percent)*deceleration;
			trace (_percent);
			tPercent.text="NOW LOADING... "+_percent+" %";
			if (Math.abs(_targetPercent-_percent)<0.5) {
				removeEventListener (Event.ENTER_FRAME, onProgressTo);
			}

			if (_percent>=100) {
				removeEventListener (Event.ENTER_FRAME,onProgressTo);
			}
		}

		//スピン回転用
		private function onProgressTo (e:Event):void {
			spin.rotation+=60;
		}

ひろゆき
Åê¹ÆNo.43024
投稿日時: 2009-7-27 16:05
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: ローディングの際、読込状況パーセントを表示する方法について
引用:
miyaryuさんは書きました:
にゃあプロジェクトさんのProgressBarコンポーネントに挑戦! (1)にて検証を行ったのですが、私と同様な状況が起こりました。つまり、ローディングバーはスライドするのですが、%表記されないということです。これは、スクリプト上の問題なのでしょうか?

[AS3.0] ProgressLoaderクラスに挑戦! (1)」にて、
ProgressBarを制御できていますよ。

「%表記されない」というのは、どこの「%表記」を指しておられるのでしょう?

引用:
しかし、やはりステージ上に登録されたプログレスバー読込状況ダイナミックテキストには、反映されません。

テキスト表示に問題があるのではないでしょうか。
このテキストフィールドが参照されていないのでは?

ProgressBar上に、テキストフィールドを配置して、そこに表示してやればいいのでは?


----------------
質問する際は、回答者に具体的な情報を与えてください。

miyaryu
Åê¹ÆNo.43033
投稿日時: 2009-7-29 8:38
常連
居住地:
投稿: 79
使用環境:
windowsXP,flash CS4
Re: ローディングの際、読込状況パーセントを表示する方法について
記載の表現がまずかったですね。
にゃあプロジェクトさんのコーディングが悪いのではということではなくて、私自身のコーディングがということです。申し訳ございません。前述までのとおり、ライブラリにクラスとしてダイナミックテキストを認識させているのですが、読込状況(0%から100%までの読込割合をダイナミックテキストに表示する)が、0%と100%表示はされても半端な状況が(例えば70%)表示されないということです。
もちろんデバッグでは、70%は表示するよう出力されているのです。ProgressBarコンポーネントに挑戦! (1)を自身のアプリケーションで組んでみたとき(そっくりそのまま写して)、読込状況が表示されないという現象が起きたものですから、行き詰まってしまいました。
これは、ローカルにて動作させても普通は表示されるのですよね!?ご教授願います。
ひろゆき
Åê¹ÆNo.43039
投稿日時: 2009-7-29 20:04
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: ローディングの際、読込状況パーセントを表示する方法について
引用:
miyaryuさんは書きました:
これは、ローカルにて動作させても普通は表示されるのですよね!?

ローカルでは、すでにダウンロードされた状態のファイルを読み込むわけですから、
「普通」は、途中の表示はされないと思います。

そのために、ムービープレビュー時に、
[表示]-[ダウンロードのシミュレート]というメニューが用意されています。


----------------
質問する際は、回答者に具体的な情報を与えてください。

miyaryu
Åê¹ÆNo.43041
投稿日時: 2009-7-30 8:53
常連
居住地:
投稿: 79
使用環境:
windowsXP,flash CS4
Re: ローディングの際、読込状況パーセントを表示する方法について
ちょんまげらさん、ありがとうございます。
シミュレートしてみたところ、読込状況が表示され完了することができました。お手数かけて申し訳ございませんでした。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops