2011-08-20 71 views
0

我目前正在研究一個Flash平臺遊戲,我試圖讓每個關卡都有自己的類,它定義了一個hitTest函數(每個類都鏈接到關卡的MovieClip),這將允許角色走在關卡上。每當我嘗試將子類導入到Document類中時,錯誤就會開始彈出,並且使我瘋狂(錯誤1120:訪問未定義的屬性)!導入外部類

任何形式的幫助,將不勝感激!

文檔類(Class_Main.as):

package 
{ 
    import flash.events.*; 
    import flash.display.*; 
    import flash.geom.Point; 
    import Level1; 
    import Level2; 

    public class Class_Main extends MovieClip 
    { 
     public var leftKeyDown:Boolean = false; 
     public var rightKeyDown:Boolean = false; 
     public var upKeyDown:Boolean = false; 
     public var downKeyDown:Boolean = false; 
     public var onGround:Boolean = true; 
     public var xSpeed:Number = 0; 
     public var ySpeed:Number = 0; 
     public var mainSpeed:Number = 3.75; 
     public var frictionPower:Number = 0.9; 
     public var jumpPower:Number = 15; 
     public var gravityPower:Number = 0.7; 
     public var terminalVelocity:Number = 75; 
     public var Level_1:Level1 = new Level1(); 
     public var Level_2:Level2 = new Level2(); 

     public function Class_Main() 
     { 
      addEventListener(Event.ADDED_TO_STAGE,init); 
      // constructor code 
     } 
     public function init(event:Event) 
     { 
      stage.addEventListener(KeyboardEvent.KEY_DOWN,checkKeysDown); 
      stage.addEventListener(KeyboardEvent.KEY_UP,checkKeysUp); 
      stage.addEventListener(Event.ENTER_FRAME,hitTest); 
      stage.addEventListener(Event.ENTER_FRAME,vCamMovement); 
      stage.addEventListener(Event.ENTER_FRAME,Main); 
     } 
     public function Main(event:Event):void 
     { 
      moveCharacter(); 
      dynamicMovement(); 
     } 
     public function checkKeysDown(event:KeyboardEvent):void 
     { 
      if (event.keyCode == 37) 
      { 
       leftKeyDown = true; 
      } 
      if (event.keyCode == 38) 
      { 
       upKeyDown = true; 
      } 
      if (event.keyCode == 39) 
      { 
       rightKeyDown = true; 
      } 
      if (event.keyCode == 40) 
      { 
       downKeyDown = true; 
      } 
     } 
     public function checkKeysUp(event:KeyboardEvent):void 
     { 
      if (event.keyCode == 37) 
      { 
       leftKeyDown = false; 
      } 
      if (event.keyCode == 38) 
      { 
       upKeyDown = false; 
      } 
      if (event.keyCode == 39) 
      { 
       rightKeyDown = false; 
      } 
      if (event.keyCode == 40) 
      { 
       downKeyDown = false; 
      } 
     } 
     public function moveCharacter():void 
     { 
      if (leftKeyDown) 
      { 
       mcMain.scaleX = -1; 
       xSpeed -= mainSpeed; 
      } 
      if (rightKeyDown) 
      { 
       mcMain.scaleX = 1; 
       xSpeed += mainSpeed; 
      } 
      if (leftKeyDown && onGround || rightKeyDown && onGround) 
      { 
       mcMain.gotoAndStop(2); 
      } 
      if (upKeyDown) 
      { 
       ySpeed -= jumpPower; 
      } 
      if (upKeyDown && leftKeyDown) 
      { 
       ySpeed -= 0; 
       xSpeed -= 10; 
      } 
      if (upKeyDown && rightKeyDown) 
      { 
       ySpeed -= 0; 
       xSpeed += 10; 
      } 
      if (xSpeed > 3 && ! onGround || xSpeed < -3 && ! onGround) 
      { 
       if (mcMain.currentFrame == 2) 
       { 
        mcMain.gotoAndStop(5); 
       } 
      } 
      if (ySpeed < -0.5 && ! onGround) 
      { 
       mcMain.gotoAndStop(4); 
      } 
      else if (ySpeed > 0.5 && ! onGround) 
      { 
       mcMain.gotoAndStop(5); 
      } 
      if (mcMain.currentFrame == 5 && onGround) 
      { 
       mcMain.gotoAndStop(1); 
      } 
      if (mcMain.currentFrame == 2) 
      { 
       if (! leftKeyDown && ! rightKeyDown) 
       { 
        mcMain.gotoAndStop(3); 
       } 
      } 
      if (mcMain.currentFrame == 3) 
      { 
       if (mcMain.skidAnimation.currentFrame == mcMain.skidAnimation.totalFrames) 
       { 
        mcMain.gotoAndStop(1); 
       } 
      } 
      //if (! leftKeyDown && ! rightKeyDown && ! upKeyDown) 
      //{ 
      //mcMain.gotoAndStop(1); 
      //} 
     } 
     public function dynamicMovement():void 
     { 
      mcMain.x += xSpeed; 
      xSpeed *= frictionPower; 
      if (xSpeed > 7) 
      { 
       xSpeed = 7; 
      } 
      if (xSpeed < -7) 
      { 
       xSpeed = -7; 
      } 
      mcMain.y += ySpeed; 
      ySpeed += gravityPower; 
      if (ySpeed > terminalVelocity) 
      { 
       ySpeed = terminalVelocity; 
      } 
     } 
     public function hitTest(event:Event) 
     { 
      spawnArea.visible = false; 
      mcMain.mcMainHitArea.visible = false; 
      Level_1.wallCollision.visible = false; 
      Level_1.deathArea.visible = false; 
      Level_1.goalArea.goalHitArea.visible = false; 

      while (Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y,true)) 
      { 
       mcMain.y--; 
      } 
      if (! Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 1,true)) 
      { 
       //upKeyDown = false; 
       if (! Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 5,true)) 
       { 
        upKeyDown = false; 
        onGround = false; 
       } 
      } 
      if (Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 1,true)) 
      { 
       ySpeed = 0; 
       if (Level_1.wallCollision.hitTestPoint(mcMain.x,mcMain.y + 5,true)) 
       { 
        onGround = true; 
       } 
      } 
      if (Level_1.wallCollision.hitTestPoint(mcMain.x - 9,mcMain.y - 25,true)) 
      { 
       mcMain.x + 9; 
       mcMain.y + 11; 
       upKeyDown = false; 
       leftKeyDown = false; 
      } 
      if (Level_1.wallCollision.hitTestPoint(mcMain.x + 9,mcMain.y - 25,true)) 
      { 
       mcMain.x - 9; 
       mcMain.y - 11; 
       upKeyDown = false; 
       rightKeyDown = false; 
      } 
      if (Level_1.wallCollision.hitTestPoint(mcMain.x - 9,mcMain.y - 11,true)) 
      { 
       xSpeed = 0; 
       leftKeyDown = false; 
      } 
      if (Level_1.wallCollision.hitTestPoint(mcMain.x + 9,mcMain.y - 11,true)) 
      { 
       xSpeed = 0; 
       rightKeyDown = false; 
      } 
      if (Level_1.deathArea.hitTestPoint(mcMain.x,mcMain.y + 1,true)) 
      { 
       mcMain.x = spawnArea.x; 
       mcMain.y = spawnArea.y; 
      } 
      if (mcMain.hitTestObject(Level_1.goalArea.goalHitArea)) 
      { 
       if (stage.contains(Level_1)) 
       { 
        this.removeChild(Level_1); 
       } 
       addChild(Level_2); 
       Level_2.x = -400; 
       Level_2.y = -700; 
      } 
     } 
     public function vCamMovement(event:Event):void 
     { 
      /*for (var i:int = 0; i < this.numChildren - 1; i++) 
      { 
      this.getChildAt(i).x -= xSpeed; 
      //levelObjects.getChildAt(i).y -= ySpeed; 
      }*/ 
      Level_1.x += stage.stageWidth * 0.5 - mcMain.x; 
      Level_1.y += stage.stageHeight * 0.5 - mcMain.y; 
      Level_2.x += stage.stageWidth * 0.5 - mcMain.x; 
      Level_2.y += stage.stageHeight * 0.5 - mcMain.y; 
      spawnArea.x += stage.stageWidth * 0.5 - mcMain.x; 
      spawnArea.y += stage.stageHeight * 0.5 - mcMain.y; 
      mcMain.x = stage.stageWidth * 0.5; 
      mcMain.y = stage.stageHeight * 0.5; 
     } 

    } 

} 

2級(Level2.as):

package 
{ 

    import flash.display.MovieClip; 
    import flash.events.*; 
    import Class_Main; 
    import Level2Walls; 

    public class Level2 extends MovieClip 
    { 
     public var classMain:Class_Main = new Class_Main ; 
     public var level2Walls:Level2Walls = new Level2Walls ; 

     public function Level2() 
     { 
      stage.addEventListener(Event.ENTER_FRAME,hitTest_2); 
      // constructor code 
     } 
     public function hitTest_2(event:Event) 
     { 
      while (level2Walls.hitTestPoint(mcMain.x,mcMain.y,true)) 
      { 
       mcMain.y--; 
      } 
      if (! level2Walls.hitTestPoint(mcMain.x,mcMain.y + 1,true)) 
      { 
       //upKeyDown = false; 
       if (! level2Walls.hitTestPoint(mcMain.x,mcMain.y + 5,true)) 
       { 
        upKeyDown = false; 
        onGround = false; 
       } 
      } 
      if (level2Walls.hitTestPoint(mcMain.x,mcMain.y + 1,true)) 
      { 
       ySpeed = 0; 
       if (level2Walls.hitTestPoint(mcMain.x,mcMain.y + 5,true)) 
       { 
        onGround = true; 
       } 
      } 
      if (level2Walls.hitTestPoint(mcMain.x - 9,mcMain.y - 25,true)) 
      { 
       mcMain.x + 9; 
       mcMain.y + 11; 
       upKeyDown = false; 
       leftKeyDown = false; 
      } 
      if (level2Walls.hitTestPoint(mcMain.x + 9,mcMain.y - 25,true)) 
      { 
       mcMain.x - 9; 
       mcMain.y - 11; 
       upKeyDown = false; 
       rightKeyDown = false; 
      } 
      if (level2Walls.hitTestPoint(mcMain.x - 9,mcMain.y - 11,true)) 
      { 
       xSpeed = 0; 
       leftKeyDown = false; 
      } 
      if (level2Walls.hitTestPoint(mcMain.x + 9,mcMain.y - 11,true)) 
      { 
       xSpeed = 0; 
       rightKeyDown = false; 
      } 
     } 

    } 

} 
+0

你得到什麼錯誤? – shanethehat

+0

我收到錯誤1120:在子類中的大部分變量(Level2.as)上訪問未定義的屬性。 – Blaze356

回答

0

您需要將對主類的引用傳遞到Level類而不是嘗試創建新實例。要做到這一點,最簡單的辦法是通過一級類的構造函數的引用,因此直到你在主類的構造函數實際上是你不應該實例化級別類:

public class Class_Main extends MovieClip 
{ 
    public var leftKeyDown:Boolean = false; 
    public var rightKeyDown:Boolean = false; 
    public var upKeyDown:Boolean = false; 
    public var downKeyDown:Boolean = false; 
    public var onGround:Boolean = true; 
    public var xSpeed:Number = 0; 
    public var ySpeed:Number = 0; 
    public var mainSpeed:Number = 3.75; 
    public var frictionPower:Number = 0.9; 
    public var jumpPower:Number = 15; 
    public var gravityPower:Number = 0.7; 
    public var terminalVelocity:Number = 75; 
    public var Level_1:Level1; 
    public var Level_2:Level2; 

    public function Class_Main() 
    { 
     addEventListener(Event.ADDED_TO_STAGE,init); 
     Level_1 = new Level1(this); 
     Level_2 = new Level2(this); 
     // constructor code 
    } 

,然後:

public class Level2 extends MovieClip 
{ 
    public var classMain:Class_Main; 
    public var level2Walls:Level2Walls = new Level2Walls; 

    public function Level2($ref:Class_Main) 
    { 
     classMain = $ref; 
     stage.addEventListener(Event.ENTER_FRAME,hitTest_2); 
     // constructor code 
    } 
你則hitTest功能

最後,使用classMain參閱您的文檔類,而不是mcMain

此外,只是關於您的Level類實例的名稱的旁註 - 您應該使用小寫字母作爲實例或屬性的第一個字母,即level_2而不是Level_2。這不會影響您運行程序的能力,但這是AS3慣例,因此是一個很好的習慣。

+0

非常感謝你!我仍然遇到一些錯誤,但他們是我無法修復的東西! – Blaze356

1

下面是一些可能會導致你的問題有兩件事情:

  • Level2不應該創建Class_Main的實例。應該永遠不會有多個文檔類的實例,並且在啓動swf時會自動實例化。

  • 在Level2構造函數中,對stage的引用將爲null。在將對象添加到顯示列表之前,您無法獲取階段的引用,直到構造函數已經運行之後才能完成此操作。

  • 我沒有看到任何地方在您的構造函數Level_1和Level_2中創建的對象被添加到舞臺上。如果這些項目是您在Flash IDE中已添加到舞臺上的符號,則不需要在構造函數中爲它們創建新實例。

  • 如果對象生活在同一個包中,則不需要添加導入語句。

我不知道任何這些東西都會清除你的錯誤,但他們至少應該讓你更接近。

+0

感謝您的回答,但現在我在重寫了編碼之後,在Level2.as中爲hitTest_2函數中的所有變量獲取了多個錯誤1120。有沒有什麼辦法可以使Level2.as讀取Class_Main.as中的所有變量而不會出現任何錯誤? – Blaze356