swfファイルを表示しようとした時の詳しい動作は以下である。
1.ID:9999の画像またはスプライト(これを以下ローダーと呼ぶ)、スプライトならばそれに含まれるファイル等を読み込む。
2.ローダーを深度0・固定画面に表示し、再生を開始する。また、残りの部分の読み込みを開始する。
3.読み込みが終わると、ローダーの再生はそのままで、メイン(_root)の再生を開始する。
ローダーは深度0・固定画面に表示されるので、これは[アクション:画面消去:ALL]では消えない。これはParaFlaの仕様である。
ローダーを消すには、[アクション:画面消去:0]とする必要がある。
getBytesTotal() を調べると、そのswfファイルのサイズがわかる。
ローダーでは通常これを使用してサイズを求めるのだが、「SWFファイルを圧縮する」機能により圧縮したswfファイルである場合、圧縮前のサイズが取得される。
例えば、圧縮前10000バイト、圧縮後5000バイトのswfファイルにローダーをつけた場合、進度が0%からはじまって50%になったところでロードが終了する事になる。(ロードが終わった50%から高速で100%まで上がるようである)
これはparafla製swfファイルの仕様のようなもので、圧縮前と圧縮後のサイズがあまり違わない場合は、気にするような事でもない。
これをどうにかしたければ、ファイルサイズは自分で調べられるものなので、それを指定すればよい。
ローダーに、
というように、getBytesTotalからファイルサイズを取得している箇所があれば、これを消し、
total = _root.getBytesTotal();
かわりに、のように直にファイルサイズ(単位はバイト)を書けばよい。
total = 1300000;
この数は、あまりきっちりと書いても正しく扱われないようである。(進度が100%を超えたりする)
正しいファイルサイズの1割増しくらいの適当に切りのよい数でいいだろう。
ローダーを作るのに必要な命令は以下の2つである。
getBytesLoaded() 現在読み込まれたバイト数が入っているので、変数に代入などして参照する。 通常、 _root つきで以下のように使う。
変数_読み込み量 = _root.getBytesLoaded();
getBytesTotal() SWFファイルのサイズが入っている。 通常、 _root つきで以下のように使う。 変数_ファイルサイズ = _root.getBytesTotal();
ローダーは9999番スプライトの中に作るわけだが、paraflaの仕様として、ローダーの中では、
・左ペインに登録したスプライトを使えない。
・attachMovieも使えない。
・createEmptyMovieClipで空のスプライトを作ることは出来る。
という制約がある。スプライトもクリップアクションも満足に使えないので、凝った見かけのものを作る場合は、描画メソッドで毎フレーム全部描き直すくらいの根性が必要になるだろう。
ParaFla 1.36より、ローダーの中のスプライトが正しく扱われるようになった。よって以下の記事は意味がない部分がある。
ローダーの全体的な流れは以下になる。
・最初の画面の表示
・全体サイズを取得(getBytesTotal)
●ラベル
・現在の読み込み量を取得(getBytesLoaded)
・(1)必要であれば:現在の読み込み量と全体サイズから、現在の進度を求め、画面に反映させる。
・(2)描画メソッドを使うのであれば:画面を消し(clear)、現在の経過フレーム数などをもとに画面を描き直す。
●ラベルへジャンプ
●〜●の間のループを、ロードが終了するまでずっとぐるぐる繰り返すことになる。
(1)
ロードは自動的に行われているので、読み込み量は常に増え続けている。
その時その時の読み込み量を取得し直して進度を計算する。
進度は(読み込み量÷全体サイズ)により(0〜1)の範囲の値が求められるので、100倍すればパーセントになる。
進度の表示にはテキストを使うといいというかそれ以外にまともな方法が見当たらない。
進度(%) = int( _root.getBytesLoaded() / _root.getBytesTotal() * 100);
(2)
画面の更新には、主に2つのパターンがある。
1.進度に依る変化
毎フレーム、進度を計算し直して、それを元に画面を変化させる。
メーターのようなものがこれに当てはまる。動作としてはシンプル。
例:進度に応じてメーターが伸びていくローダー
//現在の進度を計算する sindo = int(_root.getBytesLoaded() / _root.getBytesTotal() * 100); clear(); //何か描く前には消去 //(0,0)-(進度,20)を頂点とする長方形を描き、塗り潰す //最終的に進度100%の時に(0,0)-(100,20)を頂点とする長方形になる。 lineStyle(); beginFill(0xff0000); moveTo(0,0); lineTo(sindo,0); lineTo(sindo,20); lineTo(0,20); lineTo(0,0); endFill();
2.進度に依らない変化
ロード状況に関係なく、勝手に進むもの。変数を使って座標の管理などが必要になる。
ノリはクリップアクションと全く同じ。loadハンドラに相当する初期準備はループよりも前に、enterFrameハンドラに相当する毎フレーム処理をループの中に書く。
例:進度と関係なく●が円運動をしているローダー
//ループの前に設定しておく内容 kakudo = 0; //最初の角度 hankei = 10 //周回の半径 point_x = 100; //中心点の座標 point_y = 100; //ループの中 kakudo += 5; x = point_x + Math.cos(kakudo * Math.PI / 180) * hankei; y = point_y + Math.sin(kakudo * Math.PI / 180) * hankei; clear(); //これで(x,y)の位置に●が描ける 20は●の大きさ linestyle(20,0xff0000);moveTo(x,y);lineTo(x,y+1);