推しミネラルウォーターはありますか?

いつもお世話になっております。
ActionScript3(環境:FLASH CS4)にてフルFLASHサイトの制作を行なっております。
サイトにアクセスした際に表示されるNowLoading部分に関するご質問です。

ローディング処理部分をタイムラインの『1』に記載し、ローディング完了後にタイムライン『2』
に移動してページの表示処理が行なわれる仕組みで作りましたが、下記の点でつまずいております。

■ローディングゲージが伸びていかない。
loadingImageというMovieClipのscaleXを0にし、ローディングの読み込み完了分に
あわせて徐々にscaleXの値が上がっていき、ローディングが全て読み込みされた時点でscaleXが
1になるような仕組みで作ったつもりですが、実際にサーバにアップして確認しても
scaleXが一瞬伸びただけでローディング処理が完了してしまい、ロード完了となって次のフレームに行ってしまいます。

swfファイルの容量は320KBですが、容量が小さいことが正しくローディングされない原因なのでしょうか。

一般的なFLASHサイトのように徐々にゲージが伸びていき、ローディング処理とscaleの値を連動させるにはどのようにしたら良いでしょうか?

お手数では御座いますが、ご教授の程、宜しくお願い申し上げます。

(『loadingImage.scaleX += (per - loadingImage.scaleX)/8;』はscaleXをイージングさせる為の処理です)

// ===============================================================================
this.stop();

var info:LoaderInfo = root.loaderInfo;

// ローディングゲージMC
var loadingImage:MovieClip = new loadingImage_mc();
loadingImage.scaleX = 0;

// このタイムラインにイベントリスナーを登録
root.addEventListener(Event.ENTER_FRAME, watchLoading);
function watchLoading(event:Event) {

  var per:Number = info.bytesLoaded / info.bytesTotal;

  loadingImage.scaleX += (per - loadingImage.scaleX)/8;

  if (per >= 1) {

    // このタイムラインに登録したイベントリスナーを削除
    root.removeEventListener(Event.ENTER_FRAME, watchLoading);

    // タイムライン2に移動
    play();
  }
}
// ===============================================================================

A 回答 (2件)

#1です



例えば一瞬でダウンロード終わっちゃうとします
info.bytesLoaded / info.bytesTotal;は1です
scaleXは1/8になりますが
perはもう1になっているので
2フレーム目に移動します

scaleXは1/8より伸びることはありません
perが1になればもう次はないからです

だからscaleXがperに追いつくまで
2フレーム目にいくのは待ってほしいわけですが
perとscaleXっていうのはアキレスと亀の状態で
永遠にperにscaleXが追いつくことはありません

なので『アキレスが亀に十分近づいたら』
とかぐらいにしときます

if(scaleX>0.99)

これでもscaleXが1になることはないですが
どのみちこのイージングの方法だと
アキレスと亀の状態になってしまって
永遠にscaleXは1になることはないです



ほぼENTER_FRAME毎に変わる値に
イージングしても意味が無い
っていうのは例えば
このイージングの方法っていうのは
ゴムでなにかを引っ張ってる状態だと思ってください
ゴムを引っ張るものが引っ張った所で
止まってくれれば引っ張られるものが
引っ張ってるものに近づいていき
引っ張ってるものとの距離を縮めるほど減速していく
イージングアウトのカンジの動きになりますが
引っ張っているものが延々動き続けると
引っ張られているものは引っ張っているものに
ずっと近づくことはできず減速もしないので
イージングアウトのカンジの動きにはなりません

だからイージングアウトのカンジの動きを
してもらいたければ引っ張っているものに
ちょくちょく立ち止まってもらわなきゃいけません

その為にはたとえばperを20%区切りで
上昇させるようにしたりします


var per:Number=0
while( info.bytesLoaded / info.bytesTotal>per)per+=0.2


でも秒速何十MBという速度のご時世に
このファイルの重さだとあんまり意味ないだろうとも思います
    • good
    • 0
この回答へのお礼

H240S18B73さま

ご丁寧なご回答ありがとう御座います。
イージングの動きもなんとなく理解できました。
ご指摘いただいた内容を基に改めて処理内容を考えてみたいと思います。

お礼日時:2010/03/08 09:34

前にもいったんですが


これ、絶対にscaleXが1になる前に
フレーム2に移動しちゃうはずですよね?


ファイルが軽いのに
強制的に最後まで見せられる
プリローダーってのは
あんまりよくないんですが

まあ1秒くらいなら・・・


this.stop();

var info:LoaderInfo = root.loaderInfo;

// ローディングゲージMC
var loadingImage:MovieClip = new loadingImage_mc();
loadingImage.scaleX = 0;

// このタイムラインにイベントリスナーを登録
root.addEventListener(Event.ENTER_FRAME, watchLoading);
function watchLoading(event:Event) {

  var per:Number = info.bytesLoaded / info.bytesTotal;
if(info.bytesTotal==0)per=1

  loadingImage.scaleX +=( (per > loadingImage.scaleX)?0.05:0)

  if (scaleX >= 1) {

    // このタイムラインに登録したイベントリスナーを削除
    root.removeEventListener(Event.ENTER_FRAME, watchLoading);

    // タイムライン2に移動
    play();
  }
}


動作テストはしてません
ほぼEnterFrame毎に変わる値に向かって
イージングしてもあんまり意味ないので
イージングも取り除いてます

それから、結構まえのはなし
ブラウザのFlashPlayerによっては
ファイルが軽すぎるとprogressイベントが
発生しないなんてやつがいました(!)

そのせいでprogressごとに情報を更新するローダーは
bytesTotalもbytesLoadedも
ずっと0のままというようなことが・・・

まあこのケースでは必要ないと思いますが
心配性の慣例的につけときます
    • good
    • 0
この回答へのお礼

早々にご回答いただきましてありがとう御座います。

>これ、絶対にscaleXが1になる前に
>フレーム2に移動しちゃうはずですよね?
ファイルが軽いからでしょうか?
それとも処理上に問題でしょうか?
処理上の問題でしたらおかしな箇所をご指摘いただけると幸いです。

>ほぼEnterFrame毎に変わる値に向かって
>イージングしてもあんまり意味ないので
他のFLASHサイトを見ていると、ローディングゲージが
イージングしながら伸びているサイトを見ますが、
EnterFrame内でイージングさせる方法はありますでしょうか?

宜しくお願いいたします。

お礼日時:2010/03/04 09:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報