2011-08-20 69 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