2011-12-24 47 views
0

每當我導出我的Flash遊戲的.swf文件時,我收到"TypeError: Error #1009: Cannot access a property or method of a null object reference.",還有我的預加載程序的Runtime Shared Library Preloading Warning。我組織了我的時間線,以便第一個和第三個幀都是空的,以及Actions層中的stop();命令。第二幀包含一個包含我的所有導出資產的MovieClip,這些資產將在時間線的第三幀中初始化。我的資產(除預加載器外)都沒有在第一幀中導出。我應該對我的文檔類進行哪些更改才能在第三個框架中初始化資產?預加載後初始化資產

文檔類:

package com.gameEngine.documentClass 
{ 
    import flash.events.*; 
    import flash.display.*; 
    import flash.geom.Point; 
    import com.gameEngine.assetHolders.*; 
    import com.gameEngine.assetHolders.Levels.*; 

    public class Document extends MovieClip 
    { 
     private static var _document:Document; 
     private var preloader:Preloader; 
     public var mcMain:Player; 
     public var restartButton:RestartButton; 
     public var spawnArea:SpawnArea; 
     public var level_1:Level_1; 
     public var level_2:Level_2; 
     public var level_3:Level_3; 

     public function Document() 
     { 
      addEventListener(Event.ADDED_TO_STAGE, init); 
      _document = this; 
      preloader = new Preloader(390, this.loaderInfo); 
      this.addChild(preloader); 
      preloader.addEventListener("loadComplete", loadAssets); 
      preloader.addEventListener("preloaderFinished", showLogo); 
      mcMain = new Player(this); 
      restartButton = new RestartButton(this); 
      spawnArea = new SpawnArea(); 
      level_1 = new Level_1(this); 
      level_2 = new Level_2(this); 
      level_3 = new Level_3(this); 
      this.addChild(restartButton); 
      this.addChild(spawnArea); 
      this.preloader.x = 400; 
      this.preloader.y = 250; 
      restartButton.x = 822.95; 
      restartButton.y = 19; 
      spawnArea.x = 400; 
      spawnArea.y = 250; 
      trace ("Document Class Initialized"); 
      // constructor code 
     } 
     public static function getInstance():Document 
     { 
      return _document; 
     } 
     private function loadAssets(event:Event):void 
     { 
      this.play(); 
     } 
     private function showLogo(event:Event):void 
     { 
      this.removeChild(preloader); 
     } 
     public function init(event:Event) 
     { 
      if (stage.contains(spawnArea)) 
      { 
       addChild(mcMain); 
      } 
      mcMain.x = spawnArea.x; 
      mcMain.y = spawnArea.y; 
     } 
    } 
} 

Preloader類:

package com.gameEngine.assetHolders 
{ 
    import com.gameEngine.documentClass.*; 
    import flash.display.*; 
    import flash.events.*; 

    public class Preloader extends MovieClip 
    { 
     private var fullWidth:Number; 
     public var loaderInfo:LoaderInfo; 

     public function Preloader(fullWidth:Number = 0, loaderInfo:LoaderInfo = null) 
     { 
      this.fullWidth = fullWidth; 
      this.loaderInfo = loaderInfo; 

      addEventListener(Event.ENTER_FRAME, checkLoad); 
     } 

     private function checkLoad (event:Event):void 
     { 
      if (loaderInfo.bytesLoaded == loaderInfo.bytesTotal && loaderInfo.bytesTotal != 0) 
      { 
       dispatchEvent(new Event("loadComplete")); 
       phaseOut(); 
      } 

      updateLoader(loaderInfo.bytesLoaded/loaderInfo.bytesTotal); 
     } 

     private function updateLoader(num:Number):void 
     { 
      progressBar.width = num * fullWidth; 
     } 

     private function phaseOut():void 
     { 
      removeEventListener(Event.ENTER_FRAME, checkLoad); 
      progressBar.gotoAndPlay(2); 
      if (progressBar.currentFrame == progressBar.totalFrames) 
      { 
       phaseComplete(); 
      } 
     } 

     private function phaseComplete() : void 
     { 
      dispatchEvent(new Event("preloaderFinished")); 
     } 
    } 
} 

回答

1

你有很多的比賽條件怎麼回事。這些事件中的許多事件可能發生在相對隨機的時間。 。 。你必須思考異步。也就是說,不存在假設存在任何對象。例如,在Document.init()中,您檢查是否存在spawnArea,但幾乎可以保證不會在此時再次檢查。

沒有做任何具體的改變,我可以推薦一個通用的解決方案。對於要加載另一個對象(objA)後要加載的任何對象(objB),請在objAADDED_TO_STAGE處理程序中創建objB。一個簡單的例子是:

var objA:Whatever; 
var objB:WhateverElse; 

[...] 

objA = new Whatever(); 
objA.addEventListener(Event.ADDED_TO_STAGE, objAAddedHnd); 

[...] 

public function objAAddedHnd(event:Event) 
{ 
    // remove the event, if no longer needed: 
    objA.removeEventListener(Event.ADDED_TO_STAGE, objAAddedHnd); 

    objB = new WhateverElse(); 
    objB.addEventListener(Event.ADDED_TO_STAGE, objBAddedHnd); 
} 

[...] 

public function objBAddedHnd(event:Event) 
{ 
    // remove the event, if no longer needed: 
    objB.removeEventListener(Event.ADDED_TO_STAGE, objBAddedHnd); 

    // and so on . . . 
} 

在這一點上,它表明你需要規劃對象創建的時間線。