0

すべてのアセットが埋め込まれているメインswfのロードの進行状況を表示するようにプリローダーを設定しようとしています。ビット101で説明されているファクトリクラスメソッドを見つけましたが、ロードの進行状況が表示されていないようです。swfは正常にロードされますが、bytesLoadedは常にbytesTotalに等しいため、プリローダーが呼び出されることはありません。

これは私が使用しているファクトリークラスです

package src
{
 import flash.display.DisplayObject;
 import flash.display.MovieClip;
 import flash.display.StageScaleMode;
 import flash.display.StageAlign;
 import flash.events.Event;
 import flash.utils.getDefinitionByName;

 /**
  * ...
  * @author DefaultUser (Tools -> Custom Arguments...)
  */
 public class Factory extends MovieClip
 {
  private var preloader:Preloader;

  public function Factory()
  {
   stop();
   stage.scaleMode = StageScaleMode.NO_SCALE;
   stage.align = StageAlign.TOP_LEFT;
   addEventListener(Event.ENTER_FRAME, enterFrame);
  }

  public function enterFrame(e:Event):void
  {
   trace(root.loaderInfo.bytesLoaded, root.loaderInfo.bytesTotal);

   if (framesLoaded == totalFrames) {
    removeEventListener(Event.ENTER_FRAME, enterFrame);
    nextFrame();
    init();
   }
   else {
    var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
    trace(percent);
   }
  }

  private function init():void
  {
   var mainClass:Class = Class(getDefinitionByName("Main"));
   if (mainClass) {
    var mainApp:Object = new mainClass();
    addChild(mainApp as DisplayObject);
    mainApp.init();
   }
  }

 }

}

enterFrameイベントで呼び出されたトレースは、bytesLoadedとbytesTotalが等しいことを示しています。

そして、これはswfがロードされるときに呼び出されるMainクラスです。

package 
{
 import flash.display.Sprite;

 [Frame(factoryClass="src.Factory")]

 public class Main extends Sprite
 {
  [Embed(source="images/FinalImg01.jpg")]
  private var Image1:Class;
  [Embed(source="images/FinalImg02.jpg")]
  private var Image2:Class;
  [Embed(source="images/FinalImg03.jpg")]
  private var Image3:Class;

  public function init():void
  {
   trace("loaded");
  }
 }

}

これにより、最初にFactoryクラスが正しく呼び出され、次にMainがインスタンス化されてinit()が呼び出されます。しかし、前述したように、すべてをすぐにロードしているように見えるため、プリロードは表示されません。

これは、画像の埋め込み方法に問題がありますか、それともローカルでテストしているためですか?

他の誰かがこれらの問題に遭遇しますか?

ありがとうリッチ

4

3 に答える 3

0

私はすべてのゲームでこれと同じ方法をうまく使用しました。ローダーが反応する前にローカルテストがほとんどすべてのバイトを自動ロードするため、リモートでテストする必要があります。

そうです、それはあなたがローカルでテストしているからです。SWFをWebサーバーにアップロードすると、そこから実際のロードの進行状況を確認できます。高速接続の場合、テスト目的でファイルを人為的に肥大化しても問題はありません。

于 2009-11-03T15:19:41.057 に答える
0

どのバージョンのFlashを使用していますか?プリロードの動作はCS2とCS3では大きく異なることを私は知っています。しばらく前に、プリローダーをCS3で動作させるのと同様の問題が発生しました。

http://www.senocular.com/flash/tutorials/faq/

AS3で要約すると、他のアクションが実行される前に、SWFファイルのライブラリ全体がダウンロードされます。これを修正するには、各ライブラリアイテムにフレーム1でロードしないように指示してから、最初のフレームでプリローダーをセットアップします。

別の解決策は、プリロードを実行するための個別のSWFファイルを用意することです。プリローダーSWFが読み込まれるとすぐに、Loaderオブジェクトを使用してより大きなswfファイルを読み込むことができます。次に、Loaderオブジェクトは、イベントを通じてロードされたデータの量を取得する方法を提供します。

3番目の解決策は、SWFファイルをMochiAdsなどのサイトにアップロードし、プリロード機能を提供できるようにすることです。ゲームを作成している場合、これが最も簡単な解決策になります。

于 2009-11-05T17:48:56.937 に答える
0

私はFlashを使用していないので、ライブラリやタイムラインに直接アクセスできないため、上記の最初のフレームソリューションを公開しないことはできません。ファクトリメソッドは、Flash IDEの外部で開発している場合に必要な、純粋なアクションスクリプトでこれを実現する方法です。

さらに調査した結果、問題はFlashDevelopを使用した実装に起因していることがわかりました。最新のFlashDevelopリリースには、実際には、多くのFlexコンポーネントを不必要にインポートすることなく、同じ結果を達成する組み込みのテンプレートがあります。

さらに情報が必要な場合は、この投稿をチェックしてください

http://www.flashdevelop.org/community/viewtopic.php?f=13&t=3365

于 2009-11-06T14:05:20.157 に答える